<!DOCTYPE html>
<html>
  <head>
    <title>Random Dungeon Generator v1.0.4</title>
    <script type="text/javascript">
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// this is a completely self-contained random dungeon generator,
// implemented in HTML5 and JavaScript.
//
//   version 1.0.4      es2015 updates
//   version 1.0.3      updated save_canvas to use filename
//   version 1.0.2      linked to generator.js version 2.0
//   version 1.0.1      cache set_pixel() for performance
//   version 1.0        initial release
//
// written by drow [drow@bin.sh]
// http://creativecommons.org/licenses/by-nc/3.0/

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    </script>
    <link rel="stylesheet" href="data:text/css;base64,LyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KLyogZHVuZ2Vvbi5jc3MgKi8KCi8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCi8qIHN0cnVjdHVyZSAqLwoKYm9keSB7IG1hcmdpbjogMHB4OyBwYWRkaW5nOiAwcHg7CiAgZm9udC1mYW1pbHk6ICdBc3VsJywgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxNHB4OyB9CgovKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwovKiBjb21tb24gKi8KCmgxIHsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE1MCU7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Cgpmb3JtIHsgbWFyZ2luOiAyZXggMmVtOyBwYWRkaW5nOiAwcHg7IH0KaW5wdXQgeyBtYXJnaW4tcmlnaHQ6IDAuNWVtOyBwYWRkaW5nOiAwLjVleCAwLjVlbTsKICBmb250LWZhbWlseTogTW9uYWNvLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMTFweDsgfQpzZWxlY3QgeyBtaW4td2lkdGg6IDEwZW07IG1hcmdpbi1yaWdodDogMC41ZW07IGZvbnQtc2l6ZTogMTFweDsgfQoKdGFibGUgeyBtYXJnaW46IDBweCAyZW07IGJvcmRlcjogbm9uZTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgfQp0ZCB7IHBhZGRpbmc6IDAuNWV4IDAuNWVtOyB0ZXh0LWFsaWduOiBsZWZ0OyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB9CnRkLmtleSB7IHRleHQtYWxpZ246IHJpZ2h0OyBmb250LXdlaWdodDogYm9sZDsgfQoKY2FudmFzIHsgbWFyZ2luOiAyZXggYXV0bzsgfQoKLmNlbnRlciB7IHRleHQtYWxpZ246IGNlbnRlcjsgfQp0YWJsZS5jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB9CgovKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwovKiBzY3JlZW4gKi8KCkBtZWRpYSBzY3JlZW4gewogIGgxLnRpdGxlIHsgZGlzcGxheTogbm9uZTsgfQogIGZvcm0geyBkaXNwbGF5OiBibG9jazsgfQp9CgovKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLwovKiBwcmludCAqLwoKQG1lZGlhIHByaW50IHsKICBoMS50aXRsZSB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgZm9ybSB7IGRpc3BsYXk6IG5vbmU7IH0KfQoKLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8K" />
  </head>
  <body>
    <form class="scripted">
      <h1>Random Dungeon Generator</h1>
      <table id="form" class="center">
        <tr>
          <td class="key">Dungeon Name:</td>
          <td colspan="5" class="value"><input id="dungeon_name" size="60" /> &nbsp; <input type="button" id="new_name" value="New" /> </td>
        </tr>
        <tr>
          <td class="key">Map Style:</td>
          <td class="value"><select id="map_style"></select></td>
          <td class="key">Grid:</td>
          <td class="value"><select id="grid"></select></td>
        </tr>
        <tr>
          <td class="key">Dungeon Layout:</td>
          <td class="value"><select id="dungeon_layout"></select></td>
          <td class="key">Size:</td>
          <td class="value"><select id="dungeon_size"></select></td>
          <td class="key">Stairs?</td>
          <td class="value"><select id="add_stairs"></select></td>
        </tr>
        <tr>
          <td class="key">Room Layout:</td>
          <td class="value"><select id="room_layout"></select></td>
          <td class="key">Size:</td>
          <td class="value"><select id="room_size"></select></td>
          <td class="key">Doors:</td>
          <td class="value"><select id="doors"></select></td>
        </tr>
        <tr>
          <td class="key">Corridors:</td>
          <td class="value"><select id="corridor_layout"></select></td>
          <td class="key">Trim?</td>
          <td class="value"><select id="remove_deadends"></select></td>
        </tr>
        <tr>
          <td colspan="6"></td>
        </tr>
        <tr>
          <td colspan="6" class="center" style="background: #dedede;">
            <input id="save_map" type="button" value="Save as PNG" />
            &nbsp; <input id="print_map" type="button" value="Print" />
          </td>
        </tr>
      </table>
    </form>
    <div class="center">
      <h1 id="dungeon_title" class="title"></h1>
      <canvas id="map" width="1" height="1"><p>Your web browser does not appear to support the HTML5 &lt;canvas&gt; element.</p></canvas>
      <p><img src="" alt="" /></p>
      <p>Random Dungeon Generator<br />http://donjon.bin.sh/</p>
    </div>
    <script src="data:text/javascript;base64,dmFyIFByb3RvdHlwZT17VmVyc2lvbjoiMS43LjMiLEJyb3dzZXI6KGZ1bmN0aW9uKCl7dmFyIGI9bmF2aWdhdG9yLnVzZXJBZ2VudDt2YXIgYT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93Lm9wZXJhKT09IltvYmplY3QgT3BlcmFdIjtyZXR1cm57SUU6ISF3aW5kb3cuYXR0YWNoRXZlbnQmJiFhLE9wZXJhOmEsV2ViS2l0OmIuaW5kZXhPZigiQXBwbGVXZWJLaXQvIik+LTEsR2Vja286Yi5pbmRleE9mKCJHZWNrbyIpPi0xJiZiLmluZGV4T2YoIktIVE1MIik9PT0tMSxNb2JpbGVTYWZhcmk6L0FwcGxlLipNb2JpbGUvLnRlc3QoYil9fSkoKSxCcm93c2VyRmVhdHVyZXM6e1hQYXRoOiEhZG9jdW1lbnQuZXZhbHVhdGUsU2VsZWN0b3JzQVBJOiEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcixFbGVtZW50RXh0ZW5zaW9uczooZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuRWxlbWVudHx8d2luZG93LkhUTUxFbGVtZW50O3JldHVybiAhIShhJiZhLnByb3RvdHlwZSl9KSgpLFNwZWNpZmljRWxlbWVudEV4dGVuc2lvbnM6KGZ1bmN0aW9uKCl7aWYodHlwZW9mIHdpbmRvdy5IVE1MRGl2RWxlbWVudCE9PSJ1bmRlZmluZWQiKXtyZXR1cm4gdHJ1ZX12YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZvcm0iKSxhPWZhbHNlO2lmKGMuX19wcm90b19fJiYoYy5fX3Byb3RvX18hPT1iLl9fcHJvdG9fXykpe2E9dHJ1ZX1jPWI9bnVsbDtyZXR1cm4gYX0pKCl9LFNjcmlwdEZyYWdtZW50OiI8c2NyaXB0W14+XSo+KFtcXFNcXHNdKj8pPFwvc2NyaXB0XFxzKj4iLEpTT05GaWx0ZXI6L15cL1wqLXNlY3VyZS0oW1xzXFNdKilcKlwvXHMqJC8sZW1wdHlGdW5jdGlvbjpmdW5jdGlvbigpe30sSzpmdW5jdGlvbihhKXtyZXR1cm4gYX19O2lmKFByb3RvdHlwZS5Ccm93c2VyLk1vYmlsZVNhZmFyaSl7UHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5TcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zPWZhbHNlfXZhciBDbGFzcz0oZnVuY3Rpb24oKXt2YXIgZD0oZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4ge3RvU3RyaW5nOjF9KXtpZihlPT09InRvU3RyaW5nIil7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX0pKCk7ZnVuY3Rpb24gYSgpe31mdW5jdGlvbiBiKCl7dmFyIGg9bnVsbCxnPSRBKGFyZ3VtZW50cyk7aWYoT2JqZWN0LmlzRnVuY3Rpb24oZ1swXSkpe2g9Zy5zaGlmdCgpfWZ1bmN0aW9uIGUoKXt0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpfU9iamVjdC5leHRlbmQoZSxDbGFzcy5NZXRob2RzKTtlLnN1cGVyY2xhc3M9aDtlLnN1YmNsYXNzZXM9W107aWYoaCl7YS5wcm90b3R5cGU9aC5wcm90b3R5cGU7ZS5wcm90b3R5cGU9bmV3IGE7aC5zdWJjbGFzc2VzLnB1c2goZSl9Zm9yKHZhciBmPTAsaj1nLmxlbmd0aDtmPGo7ZisrKXtlLmFkZE1ldGhvZHMoZ1tmXSl9aWYoIWUucHJvdG90eXBlLmluaXRpYWxpemUpe2UucHJvdG90eXBlLmluaXRpYWxpemU9UHJvdG90eXBlLmVtcHR5RnVuY3Rpb259ZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTtyZXR1cm4gZX1mdW5jdGlvbiBjKGwpe3ZhciBnPXRoaXMuc3VwZXJjbGFzcyYmdGhpcy5zdXBlcmNsYXNzLnByb3RvdHlwZSxmPU9iamVjdC5rZXlzKGwpO2lmKGQpe2lmKGwudG9TdHJpbmchPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpe2YucHVzaCgidG9TdHJpbmciKX1pZihsLnZhbHVlT2YhPU9iamVjdC5wcm90b3R5cGUudmFsdWVPZil7Zi5wdXNoKCJ2YWx1ZU9mIil9fWZvcih2YXIgZT0wLGg9Zi5sZW5ndGg7ZTxoO2UrKyl7dmFyIGs9ZltlXSxqPWxba107aWYoZyYmT2JqZWN0LmlzRnVuY3Rpb24oaikmJmouYXJndW1lbnROYW1lcygpWzBdPT0iJHN1cGVyIil7dmFyIG09ajtqPShmdW5jdGlvbihpKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZ1tpXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSkoaykud3JhcChtKTtqLnZhbHVlT2Y9KGZ1bmN0aW9uKGkpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBpLnZhbHVlT2YuY2FsbChpKX19KShtKTtqLnRvU3RyaW5nPShmdW5jdGlvbihpKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaS50b1N0cmluZy5jYWxsKGkpfX0pKG0pfXRoaXMucHJvdG90eXBlW2tdPWp9cmV0dXJuIHRoaXN9cmV0dXJue2NyZWF0ZTpiLE1ldGhvZHM6e2FkZE1ldGhvZHM6Y319fSkoKTsoZnVuY3Rpb24oKXt2YXIgeT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGs9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx6PSJOdWxsIixCPSJVbmRlZmluZWQiLEs9IkJvb2xlYW4iLHc9Ik51bWJlciIsdj0iU3RyaW5nIixJPSJPYmplY3QiLGk9IltvYmplY3QgRnVuY3Rpb25dIixkPSJbb2JqZWN0IEJvb2xlYW5dIixqPSJbb2JqZWN0IE51bWJlcl0iLGY9IltvYmplY3QgU3RyaW5nXSIsYj0iW29iamVjdCBBcnJheV0iLEg9IltvYmplY3QgRGF0ZV0iLGU9d2luZG93LkpTT04mJnR5cGVvZiBKU09OLnN0cmluZ2lmeT09PSJmdW5jdGlvbiImJkpTT04uc3RyaW5naWZ5KDApPT09IjAiJiZ0eXBlb2YgSlNPTi5zdHJpbmdpZnkoUHJvdG90eXBlLkspPT09InVuZGVmaW5lZCI7dmFyIHE9WyJ0b1N0cmluZyIsInRvTG9jYWxlU3RyaW5nIiwidmFsdWVPZiIsImhhc093blByb3BlcnR5IiwiaXNQcm90b3R5cGVPZiIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiY29uc3RydWN0b3IiXTt2YXIgYT0oZnVuY3Rpb24oKXtmb3IodmFyIEwgaW4ge3RvU3RyaW5nOjF9KXtpZihMPT09InRvU3RyaW5nIil7cmV0dXJuIGZhbHNlfX1yZXR1cm4gdHJ1ZX0pKCk7ZnVuY3Rpb24gRChNKXtzd2l0Y2goTSl7Y2FzZSBudWxsOnJldHVybiB6O2Nhc2UgKHZvaWQgMCk6cmV0dXJuIEJ9dmFyIEw9dHlwZW9mIE07c3dpdGNoKEwpe2Nhc2UiYm9vbGVhbiI6cmV0dXJuIEs7Y2FzZSJudW1iZXIiOnJldHVybiB3O2Nhc2Uic3RyaW5nIjpyZXR1cm4gdn1yZXR1cm4gSX1mdW5jdGlvbiBoKEwsTil7Zm9yKHZhciBNIGluIE4pe0xbTV09TltNXX1yZXR1cm4gTH1mdW5jdGlvbiBsKEwpe3RyeXtpZihvKEwpKXtyZXR1cm4idW5kZWZpbmVkIn1pZihMPT09bnVsbCl7cmV0dXJuIm51bGwifXJldHVybiBMLmluc3BlY3Q/TC5pbnNwZWN0KCk6U3RyaW5nKEwpfWNhdGNoKE0pe2lmKE0gaW5zdGFuY2VvZiBSYW5nZUVycm9yKXtyZXR1cm4iLi4uIn10aHJvdyBNfX1mdW5jdGlvbiBBKEwpe3JldHVybiBtKCIiLHsiIjpMfSxbXSl9ZnVuY3Rpb24gbShVLFIsUyl7dmFyIFQ9UltVXTtpZihEKFQpPT09SSYmdHlwZW9mIFQudG9KU09OPT09ImZ1bmN0aW9uIil7VD1ULnRvSlNPTihVKX12YXIgTj15LmNhbGwoVCk7c3dpdGNoKE4pe2Nhc2UgajpjYXNlIGQ6Y2FzZSBmOlQ9VC52YWx1ZU9mKCl9c3dpdGNoKFQpe2Nhc2UgbnVsbDpyZXR1cm4ibnVsbCI7Y2FzZSB0cnVlOnJldHVybiJ0cnVlIjtjYXNlIGZhbHNlOnJldHVybiJmYWxzZSJ9dmFyIFE9dHlwZW9mIFQ7c3dpdGNoKFEpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gVC5pbnNwZWN0KHRydWUpO2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNGaW5pdGUoVCk/U3RyaW5nKFQpOiJudWxsIjtjYXNlIm9iamVjdCI6Zm9yKHZhciBNPTAsTD1TLmxlbmd0aDtNPEw7TSsrKXtpZihTW01dPT09VCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ3ljbGljIHJlZmVyZW5jZSB0byAnIitUKyInIGluIG9iamVjdCIpfX1TLnB1c2goVCk7dmFyIFA9W107aWYoTj09PWIpe2Zvcih2YXIgTT0wLEw9VC5sZW5ndGg7TTxMO00rKyl7dmFyIE89bShNLFQsUyk7UC5wdXNoKHR5cGVvZiBPPT09InVuZGVmaW5lZCI/Im51bGwiOk8pfVA9IlsiK1Auam9pbigiLCIpKyJdIn1lbHNle3ZhciBWPU9iamVjdC5rZXlzKFQpO2Zvcih2YXIgTT0wLEw9Vi5sZW5ndGg7TTxMO00rKyl7dmFyIFU9VltNXSxPPW0oVSxULFMpO2lmKHR5cGVvZiBPIT09InVuZGVmaW5lZCIpe1AucHVzaChVLmluc3BlY3QodHJ1ZSkrIjoiK08pfX1QPSJ7IitQLmpvaW4oIiwiKSsifSJ9Uy5wb3AoKTtyZXR1cm4gUH19ZnVuY3Rpb24gSihMKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoTCl9ZnVuY3Rpb24gQyhMKXtyZXR1cm4gJEgoTCkudG9RdWVyeVN0cmluZygpfWZ1bmN0aW9uIHAoTCl7cmV0dXJuIEwmJkwudG9IVE1MP0wudG9IVE1MKCk6U3RyaW5nLmludGVycHJldChMKX1mdW5jdGlvbiB4KEwpe2lmKEQoTCkhPT1JKXt0aHJvdyBuZXcgVHlwZUVycm9yKCl9dmFyIE49W107Zm9yKHZhciBPIGluIEwpe2lmKGsuY2FsbChMLE8pKXtOLnB1c2goTyl9fWlmKGEpe2Zvcih2YXIgTT0wO089cVtNXTtNKyspe2lmKGsuY2FsbChMLE8pKXtOLnB1c2goTyl9fX1yZXR1cm4gTn1mdW5jdGlvbiBHKEwpe3ZhciBNPVtdO2Zvcih2YXIgTiBpbiBMKXtNLnB1c2goTFtOXSl9cmV0dXJuIE19ZnVuY3Rpb24gcyhMKXtyZXR1cm4gaCh7fSxMKX1mdW5jdGlvbiBFKEwpe3JldHVybiAhIShMJiZMLm5vZGVUeXBlPT0xKX1mdW5jdGlvbiB1KEwpe3JldHVybiB5LmNhbGwoTCk9PT1ifXZhciBjPSh0eXBlb2YgQXJyYXkuaXNBcnJheT09ImZ1bmN0aW9uIikmJkFycmF5LmlzQXJyYXkoW10pJiYhQXJyYXkuaXNBcnJheSh7fSk7aWYoYyl7dT1BcnJheS5pc0FycmF5fWZ1bmN0aW9uIHIoTCl7cmV0dXJuIEwgaW5zdGFuY2VvZiBIYXNofWZ1bmN0aW9uIG4oTCl7cmV0dXJuIHkuY2FsbChMKT09PWl9ZnVuY3Rpb24gZyhMKXtyZXR1cm4geS5jYWxsKEwpPT09Zn1mdW5jdGlvbiBGKEwpe3JldHVybiB5LmNhbGwoTCk9PT1qfWZ1bmN0aW9uIHQoTCl7cmV0dXJuIHkuY2FsbChMKT09PUh9ZnVuY3Rpb24gbyhMKXtyZXR1cm4gdHlwZW9mIEw9PT0idW5kZWZpbmVkIn1oKE9iamVjdCx7ZXh0ZW5kOmgsaW5zcGVjdDpsLHRvSlNPTjplP0o6QSx0b1F1ZXJ5U3RyaW5nOkMsdG9IVE1MOnAsa2V5czpPYmplY3Qua2V5c3x8eCx2YWx1ZXM6RyxjbG9uZTpzLGlzRWxlbWVudDpFLGlzQXJyYXk6dSxpc0hhc2g6cixpc0Z1bmN0aW9uOm4saXNTdHJpbmc6Zyxpc051bWJlcjpGLGlzRGF0ZTp0LGlzVW5kZWZpbmVkOm99KX0pKCk7T2JqZWN0LmV4dGVuZChGdW5jdGlvbi5wcm90b3R5cGUsKGZ1bmN0aW9uKCl7dmFyIGw9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIGQocCxtKXt2YXIgbz1wLmxlbmd0aCxuPW0ubGVuZ3RoO3doaWxlKG4tLSl7cFtvK25dPW1bbl19cmV0dXJuIHB9ZnVuY3Rpb24gaihuLG0pe249bC5jYWxsKG4sMCk7cmV0dXJuIGQobixtKX1mdW5jdGlvbiBnKCl7dmFyIG09dGhpcy50b1N0cmluZygpLm1hdGNoKC9eW1xzXChdKmZ1bmN0aW9uW14oXSpcKChbXildKilcKS8pWzFdLnJlcGxhY2UoL1wvXC8uKj9bXHJcbl18XC9cKig/Oi58W1xyXG5dKSo/XCpcLy9nLCIiKS5yZXBsYWNlKC9ccysvZywiIikuc3BsaXQoIiwiKTtyZXR1cm4gbS5sZW5ndGg9PTEmJiFtWzBdP1tdOm19ZnVuY3Rpb24gaChvKXtpZihhcmd1bWVudHMubGVuZ3RoPDImJk9iamVjdC5pc1VuZGVmaW5lZChhcmd1bWVudHNbMF0pKXtyZXR1cm4gdGhpc31pZighT2JqZWN0LmlzRnVuY3Rpb24odGhpcykpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBvYmplY3QgaXMgbm90IGNhbGxhYmxlLiIpfXZhciBxPWZ1bmN0aW9uKCl7fTt2YXIgbT10aGlzLG49bC5jYWxsKGFyZ3VtZW50cywxKTt2YXIgcD1mdW5jdGlvbigpe3ZhciByPWoobixhcmd1bWVudHMpO3ZhciBzPXRoaXMgaW5zdGFuY2VvZiBwP3RoaXM6bztyZXR1cm4gbS5hcHBseShzLHIpfTtxLnByb3RvdHlwZT10aGlzLnByb3RvdHlwZTtwLnByb3RvdHlwZT1uZXcgcSgpO3JldHVybiBwfWZ1bmN0aW9uIGYobyl7dmFyIG09dGhpcyxuPWwuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGZ1bmN0aW9uKHEpe3ZhciBwPWQoW3F8fHdpbmRvdy5ldmVudF0sbik7cmV0dXJuIG0uYXBwbHkobyxwKX19ZnVuY3Rpb24gaygpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXtyZXR1cm4gdGhpc312YXIgbT10aGlzLG49bC5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1qKG4sYXJndW1lbnRzKTtyZXR1cm4gbS5hcHBseSh0aGlzLG8pfX1mdW5jdGlvbiBlKG8pe3ZhciBtPXRoaXMsbj1sLmNhbGwoYXJndW1lbnRzLDEpO289byoxMDAwO3JldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBtLmFwcGx5KG0sbil9LG8pfWZ1bmN0aW9uIGEoKXt2YXIgbT1kKFswLjAxXSxhcmd1bWVudHMpO3JldHVybiB0aGlzLmRlbGF5LmFwcGx5KHRoaXMsbSl9ZnVuY3Rpb24gYyhuKXt2YXIgbT10aGlzO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWQoW20uYmluZCh0aGlzKV0sYXJndW1lbnRzKTtyZXR1cm4gbi5hcHBseSh0aGlzLG8pfX1mdW5jdGlvbiBiKCl7aWYodGhpcy5fbWV0aG9kaXplZCl7cmV0dXJuIHRoaXMuX21ldGhvZGl6ZWR9dmFyIG09dGhpcztyZXR1cm4gdGhpcy5fbWV0aG9kaXplZD1mdW5jdGlvbigpe3ZhciBuPWQoW3RoaXNdLGFyZ3VtZW50cyk7cmV0dXJuIG0uYXBwbHkobnVsbCxuKX19dmFyIGk9e2FyZ3VtZW50TmFtZXM6ZyxiaW5kQXNFdmVudExpc3RlbmVyOmYsY3Vycnk6ayxkZWxheTplLGRlZmVyOmEsd3JhcDpjLG1ldGhvZGl6ZTpifTtpZighRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQpe2kuYmluZD1ofXJldHVybiBpfSkoKSk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gdGhpcy5nZXRVVENGdWxsWWVhcigpKyItIisodGhpcy5nZXRVVENNb250aCgpKzEpLnRvUGFkZGVkU3RyaW5nKDIpKyItIit0aGlzLmdldFVUQ0RhdGUoKS50b1BhZGRlZFN0cmluZygyKSsiVCIrdGhpcy5nZXRVVENIb3VycygpLnRvUGFkZGVkU3RyaW5nKDIpKyI6Iit0aGlzLmdldFVUQ01pbnV0ZXMoKS50b1BhZGRlZFN0cmluZygyKSsiOiIrdGhpcy5nZXRVVENTZWNvbmRzKCkudG9QYWRkZWRTdHJpbmcoMikrIloifWZ1bmN0aW9uIGEoKXtyZXR1cm4gdGhpcy50b0lTT1N0cmluZygpfWlmKCFjLnRvSVNPU3RyaW5nKXtjLnRvSVNPU3RyaW5nPWJ9aWYoIWMudG9KU09OKXtjLnRvSlNPTj1hfX0pKERhdGUucHJvdG90eXBlKTtSZWdFeHAucHJvdG90eXBlLm1hdGNoPVJlZ0V4cC5wcm90b3R5cGUudGVzdDtSZWdFeHAuZXNjYXBlPWZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSkucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgpfFtcXVwvXFxdKS9nLCJcXCQxIil9O3ZhciBQZXJpb2RpY2FsRXhlY3V0ZXI9Q2xhc3MuY3JlYXRlKHtpbml0aWFsaXplOmZ1bmN0aW9uKGIsYSl7dGhpcy5jYWxsYmFjaz1iO3RoaXMuZnJlcXVlbmN5PWE7dGhpcy5jdXJyZW50bHlFeGVjdXRpbmc9ZmFsc2U7dGhpcy5yZWdpc3RlckNhbGxiYWNrKCl9LHJlZ2lzdGVyQ2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnRpbWVyPXNldEludGVydmFsKHRoaXMub25UaW1lckV2ZW50LmJpbmQodGhpcyksdGhpcy5mcmVxdWVuY3kqMTAwMCl9LGV4ZWN1dGU6ZnVuY3Rpb24oKXt0aGlzLmNhbGxiYWNrKHRoaXMpfSxzdG9wOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGltZXIpe3JldHVybn1jbGVhckludGVydmFsKHRoaXMudGltZXIpO3RoaXMudGltZXI9bnVsbH0sb25UaW1lckV2ZW50OmZ1bmN0aW9uKCl7aWYoIXRoaXMuY3VycmVudGx5RXhlY3V0aW5nKXt0cnl7dGhpcy5jdXJyZW50bHlFeGVjdXRpbmc9dHJ1ZTt0aGlzLmV4ZWN1dGUoKTt0aGlzLmN1cnJlbnRseUV4ZWN1dGluZz1mYWxzZX1jYXRjaChhKXt0aGlzLmN1cnJlbnRseUV4ZWN1dGluZz1mYWxzZTt0aHJvdyBhfX19fSk7T2JqZWN0LmV4dGVuZChTdHJpbmcse2ludGVycHJldDpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjpTdHJpbmcoYSl9LHNwZWNpYWxDaGFyOnsiXGIiOiJcXGIiLCJcdCI6IlxcdCIsIlxuIjoiXFxuIiwiXGYiOiJcXGYiLCJcciI6IlxcciIsIlxcIjoiXFxcXCJ9fSk7T2JqZWN0LmV4dGVuZChTdHJpbmcucHJvdG90eXBlLChmdW5jdGlvbigpe3ZhciBOQVRJVkVfSlNPTl9QQVJTRV9TVVBQT1JUPXdpbmRvdy5KU09OJiZ0eXBlb2YgSlNPTi5wYXJzZT09PSJmdW5jdGlvbiImJkpTT04ucGFyc2UoJ3sidGVzdCI6IHRydWV9JykudGVzdDtmdW5jdGlvbiBwcmVwYXJlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQpe2lmKE9iamVjdC5pc0Z1bmN0aW9uKHJlcGxhY2VtZW50KSl7cmV0dXJuIHJlcGxhY2VtZW50fXZhciB0ZW1wbGF0ZT1uZXcgVGVtcGxhdGUocmVwbGFjZW1lbnQpO3JldHVybiBmdW5jdGlvbihtYXRjaCl7cmV0dXJuIHRlbXBsYXRlLmV2YWx1YXRlKG1hdGNoKX19ZnVuY3Rpb24gaXNOb25FbXB0eVJlZ0V4cChyZWdleHApe3JldHVybiByZWdleHAuc291cmNlJiZyZWdleHAuc291cmNlIT09Iig/OikifWZ1bmN0aW9uIGdzdWIocGF0dGVybixyZXBsYWNlbWVudCl7dmFyIHJlc3VsdD0iIixzb3VyY2U9dGhpcyxtYXRjaDtyZXBsYWNlbWVudD1wcmVwYXJlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQpO2lmKE9iamVjdC5pc1N0cmluZyhwYXR0ZXJuKSl7cGF0dGVybj1SZWdFeHAuZXNjYXBlKHBhdHRlcm4pfWlmKCEocGF0dGVybi5sZW5ndGh8fGlzTm9uRW1wdHlSZWdFeHAocGF0dGVybikpKXtyZXBsYWNlbWVudD1yZXBsYWNlbWVudCgiIik7cmV0dXJuIHJlcGxhY2VtZW50K3NvdXJjZS5zcGxpdCgiIikuam9pbihyZXBsYWNlbWVudCkrcmVwbGFjZW1lbnR9d2hpbGUoc291cmNlLmxlbmd0aD4wKXttYXRjaD1zb3VyY2UubWF0Y2gocGF0dGVybik7aWYobWF0Y2gmJm1hdGNoWzBdLmxlbmd0aD4wKXtyZXN1bHQrPXNvdXJjZS5zbGljZSgwLG1hdGNoLmluZGV4KTtyZXN1bHQrPVN0cmluZy5pbnRlcnByZXQocmVwbGFjZW1lbnQobWF0Y2gpKTtzb3VyY2U9c291cmNlLnNsaWNlKG1hdGNoLmluZGV4K21hdGNoWzBdLmxlbmd0aCl9ZWxzZXtyZXN1bHQrPXNvdXJjZSxzb3VyY2U9IiJ9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gc3ViKHBhdHRlcm4scmVwbGFjZW1lbnQsY291bnQpe3JlcGxhY2VtZW50PXByZXBhcmVSZXBsYWNlbWVudChyZXBsYWNlbWVudCk7Y291bnQ9T2JqZWN0LmlzVW5kZWZpbmVkKGNvdW50KT8xOmNvdW50O3JldHVybiB0aGlzLmdzdWIocGF0dGVybixmdW5jdGlvbihtYXRjaCl7aWYoLS1jb3VudDwwKXtyZXR1cm4gbWF0Y2hbMF19cmV0dXJuIHJlcGxhY2VtZW50KG1hdGNoKX0pfWZ1bmN0aW9uIHNjYW4ocGF0dGVybixpdGVyYXRvcil7dGhpcy5nc3ViKHBhdHRlcm4saXRlcmF0b3IpO3JldHVybiBTdHJpbmcodGhpcyl9ZnVuY3Rpb24gdHJ1bmNhdGUobGVuZ3RoLHRydW5jYXRpb24pe2xlbmd0aD1sZW5ndGh8fDMwO3RydW5jYXRpb249T2JqZWN0LmlzVW5kZWZpbmVkKHRydW5jYXRpb24pPyIuLi4iOnRydW5jYXRpb247cmV0dXJuIHRoaXMubGVuZ3RoPmxlbmd0aD90aGlzLnNsaWNlKDAsbGVuZ3RoLXRydW5jYXRpb24ubGVuZ3RoKSt0cnVuY2F0aW9uOlN0cmluZyh0aGlzKX1mdW5jdGlvbiBzdHJpcCgpe3JldHVybiB0aGlzLnJlcGxhY2UoL15ccysvLCIiKS5yZXBsYWNlKC9ccyskLywiIil9ZnVuY3Rpb24gc3RyaXBUYWdzKCl7cmV0dXJuIHRoaXMucmVwbGFjZSgvPFx3KyhccysoIlteIl0qInwnW14nXSonfFtePl0pKyk/KFwvKT8+fDxcL1x3Kz4vZ2ksIiIpfWZ1bmN0aW9uIHN0cmlwU2NyaXB0cygpe3JldHVybiB0aGlzLnJlcGxhY2UobmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsImltZyIpLCIiKX1mdW5jdGlvbiBleHRyYWN0U2NyaXB0cygpe3ZhciBtYXRjaEFsbD1uZXcgUmVnRXhwKFByb3RvdHlwZS5TY3JpcHRGcmFnbWVudCwiaW1nIiksbWF0Y2hPbmU9bmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsImltIik7cmV0dXJuKHRoaXMubWF0Y2gobWF0Y2hBbGwpfHxbXSkubWFwKGZ1bmN0aW9uKHNjcmlwdFRhZyl7cmV0dXJuKHNjcmlwdFRhZy5tYXRjaChtYXRjaE9uZSl8fFsiIiwiIl0pWzFdfSl9ZnVuY3Rpb24gZXZhbFNjcmlwdHMoKXtyZXR1cm4gdGhpcy5leHRyYWN0U2NyaXB0cygpLm1hcChmdW5jdGlvbihzY3JpcHQpe3JldHVybiBldmFsKHNjcmlwdCl9KX1mdW5jdGlvbiBlc2NhcGVIVE1MKCl7cmV0dXJuIHRoaXMucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpfWZ1bmN0aW9uIHVuZXNjYXBlSFRNTCgpe3JldHVybiB0aGlzLnN0cmlwVGFncygpLnJlcGxhY2UoLyZsdDsvZywiPCIpLnJlcGxhY2UoLyZndDsvZywiPiIpLnJlcGxhY2UoLyZhbXA7L2csIiYiKX1mdW5jdGlvbiB0b1F1ZXJ5UGFyYW1zKHNlcGFyYXRvcil7dmFyIG1hdGNoPXRoaXMuc3RyaXAoKS5tYXRjaCgvKFtePyNdKikoIy4qKT8kLyk7aWYoIW1hdGNoKXtyZXR1cm57fX1yZXR1cm4gbWF0Y2hbMV0uc3BsaXQoc2VwYXJhdG9yfHwiJiIpLmluamVjdCh7fSxmdW5jdGlvbihoYXNoLHBhaXIpe2lmKChwYWlyPXBhaXIuc3BsaXQoIj0iKSlbMF0pe3ZhciBrZXk9ZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIuc2hpZnQoKSksdmFsdWU9cGFpci5sZW5ndGg+MT9wYWlyLmpvaW4oIj0iKTpwYWlyWzBdO2lmKHZhbHVlIT11bmRlZmluZWQpe3ZhbHVlPXZhbHVlLmdzdWIoIisiLCIgIik7dmFsdWU9ZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKX1pZihrZXkgaW4gaGFzaCl7aWYoIU9iamVjdC5pc0FycmF5KGhhc2hba2V5XSkpe2hhc2hba2V5XT1baGFzaFtrZXldXX1oYXNoW2tleV0ucHVzaCh2YWx1ZSl9ZWxzZXtoYXNoW2tleV09dmFsdWV9fXJldHVybiBoYXNofSl9ZnVuY3Rpb24gdG9BcnJheSgpe3JldHVybiB0aGlzLnNwbGl0KCIiKX1mdW5jdGlvbiBzdWNjKCl7cmV0dXJuIHRoaXMuc2xpY2UoMCx0aGlzLmxlbmd0aC0xKStTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuY2hhckNvZGVBdCh0aGlzLmxlbmd0aC0xKSsxKX1mdW5jdGlvbiB0aW1lcyhjb3VudCl7cmV0dXJuIGNvdW50PDE/IiI6bmV3IEFycmF5KGNvdW50KzEpLmpvaW4odGhpcyl9ZnVuY3Rpb24gY2FtZWxpemUoKXtyZXR1cm4gdGhpcy5yZXBsYWNlKC8tKyguKT8vZyxmdW5jdGlvbihtYXRjaCxjaHIpe3JldHVybiBjaHI/Y2hyLnRvVXBwZXJDYXNlKCk6IiJ9KX1mdW5jdGlvbiBjYXBpdGFsaXplKCl7cmV0dXJuIHRoaXMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdGhpcy5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiB1bmRlcnNjb3JlKCl7cmV0dXJuIHRoaXMucmVwbGFjZSgvOjovZywiLyIpLnJlcGxhY2UoLyhbQS1aXSspKFtBLVpdW2Etel0pL2csIiQxXyQyIikucmVwbGFjZSgvKFthLXpcZF0pKFtBLVpdKS9nLCIkMV8kMiIpLnJlcGxhY2UoLy0vZywiXyIpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gZGFzaGVyaXplKCl7cmV0dXJuIHRoaXMucmVwbGFjZSgvXy9nLCItIil9ZnVuY3Rpb24gaW5zcGVjdCh1c2VEb3VibGVRdW90ZXMpe3ZhciBlc2NhcGVkU3RyaW5nPXRoaXMucmVwbGFjZSgvW1x4MDAtXHgxZlxcXS9nLGZ1bmN0aW9uKGNoYXJhY3Rlcil7aWYoY2hhcmFjdGVyIGluIFN0cmluZy5zcGVjaWFsQ2hhcil7cmV0dXJuIFN0cmluZy5zcGVjaWFsQ2hhcltjaGFyYWN0ZXJdfXJldHVybiJcXHUwMCIrY2hhcmFjdGVyLmNoYXJDb2RlQXQoKS50b1BhZGRlZFN0cmluZygyLDE2KX0pO2lmKHVzZURvdWJsZVF1b3Rlcyl7cmV0dXJuJyInK2VzY2FwZWRTdHJpbmcucmVwbGFjZSgvIi9nLCdcXCInKSsnIid9cmV0dXJuIiciK2VzY2FwZWRTdHJpbmcucmVwbGFjZSgvJy9nLCJcXCciKSsiJyJ9ZnVuY3Rpb24gdW5maWx0ZXJKU09OKGZpbHRlcil7cmV0dXJuIHRoaXMucmVwbGFjZShmaWx0ZXJ8fFByb3RvdHlwZS5KU09ORmlsdGVyLCIkMSIpfWZ1bmN0aW9uIGlzSlNPTigpe3ZhciBzdHI9dGhpcztpZihzdHIuYmxhbmsoKSl7cmV0dXJuIGZhbHNlfXN0cj1zdHIucmVwbGFjZSgvXFwoPzpbIlxcXC9iZm5ydF18dVswLTlhLWZBLUZdezR9KS9nLCJAIik7c3RyPXN0ci5yZXBsYWNlKC8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZywiXSIpO3N0cj1zdHIucmVwbGFjZSgvKD86Xnw6fCwpKD86XHMqXFspKy9nLCIiKTtyZXR1cm4oL15bXF0sOnt9XHNdKiQvKS50ZXN0KHN0cil9ZnVuY3Rpb24gZXZhbEpTT04oc2FuaXRpemUpe3ZhciBqc29uPXRoaXMudW5maWx0ZXJKU09OKCksY3g9L1tcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZlx1MDAwMF0vZztpZihjeC50ZXN0KGpzb24pKXtqc29uPWpzb24ucmVwbGFjZShjeCxmdW5jdGlvbihhKXtyZXR1cm4iXFx1IisoIjAwMDAiK2EuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KX0pfXRyeXtpZighc2FuaXRpemV8fGpzb24uaXNKU09OKCkpe3JldHVybiBldmFsKCIoIitqc29uKyIpIil9fWNhdGNoKGUpe310aHJvdyBuZXcgU3ludGF4RXJyb3IoIkJhZGx5IGZvcm1lZCBKU09OIHN0cmluZzogIit0aGlzLmluc3BlY3QoKSl9ZnVuY3Rpb24gcGFyc2VKU09OKCl7dmFyIGpzb249dGhpcy51bmZpbHRlckpTT04oKTtyZXR1cm4gSlNPTi5wYXJzZShqc29uKX1mdW5jdGlvbiBpbmNsdWRlKHBhdHRlcm4pe3JldHVybiB0aGlzLmluZGV4T2YocGF0dGVybik+LTF9ZnVuY3Rpb24gc3RhcnRzV2l0aChwYXR0ZXJuLHBvc2l0aW9uKXtwb3NpdGlvbj1PYmplY3QuaXNOdW1iZXIocG9zaXRpb24pP3Bvc2l0aW9uOjA7cmV0dXJuIHRoaXMubGFzdEluZGV4T2YocGF0dGVybixwb3NpdGlvbik9PT1wb3NpdGlvbn1mdW5jdGlvbiBlbmRzV2l0aChwYXR0ZXJuLHBvc2l0aW9uKXtwYXR0ZXJuPVN0cmluZyhwYXR0ZXJuKTtwb3NpdGlvbj1PYmplY3QuaXNOdW1iZXIocG9zaXRpb24pP3Bvc2l0aW9uOnRoaXMubGVuZ3RoO2lmKHBvc2l0aW9uPDApe3Bvc2l0aW9uPTB9aWYocG9zaXRpb24+dGhpcy5sZW5ndGgpe3Bvc2l0aW9uPXRoaXMubGVuZ3RofXZhciBkPXBvc2l0aW9uLXBhdHRlcm4ubGVuZ3RoO3JldHVybiBkPj0wJiZ0aGlzLmluZGV4T2YocGF0dGVybixkKT09PWR9ZnVuY3Rpb24gZW1wdHkoKXtyZXR1cm4gdGhpcz09IiJ9ZnVuY3Rpb24gYmxhbmsoKXtyZXR1cm4vXlxzKiQvLnRlc3QodGhpcyl9ZnVuY3Rpb24gaW50ZXJwb2xhdGUob2JqZWN0LHBhdHRlcm4pe3JldHVybiBuZXcgVGVtcGxhdGUodGhpcyxwYXR0ZXJuKS5ldmFsdWF0ZShvYmplY3QpfXJldHVybntnc3ViOmdzdWIsc3ViOnN1YixzY2FuOnNjYW4sdHJ1bmNhdGU6dHJ1bmNhdGUsc3RyaXA6U3RyaW5nLnByb3RvdHlwZS50cmltfHxzdHJpcCxzdHJpcFRhZ3M6c3RyaXBUYWdzLHN0cmlwU2NyaXB0czpzdHJpcFNjcmlwdHMsZXh0cmFjdFNjcmlwdHM6ZXh0cmFjdFNjcmlwdHMsZXZhbFNjcmlwdHM6ZXZhbFNjcmlwdHMsZXNjYXBlSFRNTDplc2NhcGVIVE1MLHVuZXNjYXBlSFRNTDp1bmVzY2FwZUhUTUwsdG9RdWVyeVBhcmFtczp0b1F1ZXJ5UGFyYW1zLHBhcnNlUXVlcnk6dG9RdWVyeVBhcmFtcyx0b0FycmF5OnRvQXJyYXksc3VjYzpzdWNjLHRpbWVzOnRpbWVzLGNhbWVsaXplOmNhbWVsaXplLGNhcGl0YWxpemU6Y2FwaXRhbGl6ZSx1bmRlcnNjb3JlOnVuZGVyc2NvcmUsZGFzaGVyaXplOmRhc2hlcml6ZSxpbnNwZWN0Omluc3BlY3QsdW5maWx0ZXJKU09OOnVuZmlsdGVySlNPTixpc0pTT046aXNKU09OLGV2YWxKU09OOk5BVElWRV9KU09OX1BBUlNFX1NVUFBPUlQ/cGFyc2VKU09OOmV2YWxKU09OLGluY2x1ZGU6aW5jbHVkZSxzdGFydHNXaXRoOlN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aHx8c3RhcnRzV2l0aCxlbmRzV2l0aDpTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRofHxlbmRzV2l0aCxlbXB0eTplbXB0eSxibGFuazpibGFuayxpbnRlcnBvbGF0ZTppbnRlcnBvbGF0ZX19KSgpKTt2YXIgVGVtcGxhdGU9Q2xhc3MuY3JlYXRlKHtpbml0aWFsaXplOmZ1bmN0aW9uKGEsYil7dGhpcy50ZW1wbGF0ZT1hLnRvU3RyaW5nKCk7dGhpcy5wYXR0ZXJuPWJ8fFRlbXBsYXRlLlBhdHRlcm59LGV2YWx1YXRlOmZ1bmN0aW9uKGEpe2lmKGEmJk9iamVjdC5pc0Z1bmN0aW9uKGEudG9UZW1wbGF0ZVJlcGxhY2VtZW50cykpe2E9YS50b1RlbXBsYXRlUmVwbGFjZW1lbnRzKCl9cmV0dXJuIHRoaXMudGVtcGxhdGUuZ3N1Yih0aGlzLnBhdHRlcm4sZnVuY3Rpb24oZCl7aWYoYT09bnVsbCl7cmV0dXJuKGRbMV0rIiIpfXZhciBmPWRbMV18fCIiO2lmKGY9PSJcXCIpe3JldHVybiBkWzJdfXZhciBiPWEsZz1kWzNdLGU9L14oW14uW10rfFxbKCg/Oi4qP1teXFxdKT8pXF0pKFwufFxbfCQpLztkPWUuZXhlYyhnKTtpZihkPT1udWxsKXtyZXR1cm4gZn13aGlsZShkIT1udWxsKXt2YXIgYz1kWzFdLnN0YXJ0c1dpdGgoIlsiKT9kWzJdLnJlcGxhY2UoL1xcXFxdL2csIl0iKTpkWzFdO2I9YltjXTtpZihudWxsPT1ifHwiIj09ZFszXSl7YnJlYWt9Zz1nLnN1YnN0cmluZygiWyI9PWRbM10/ZFsxXS5sZW5ndGg6ZFswXS5sZW5ndGgpO2Q9ZS5leGVjKGcpfXJldHVybiBmK1N0cmluZy5pbnRlcnByZXQoYil9KX19KTtUZW1wbGF0ZS5QYXR0ZXJuPS8oXnwufFxyfFxuKSgjXHsoLio/KVx9KS87dmFyICRicmVhaz17fTt2YXIgRW51bWVyYWJsZT0oZnVuY3Rpb24oKXtmdW5jdGlvbiBjKHgsdyl7dHJ5e3RoaXMuX2VhY2goeCx3KX1jYXRjaCh5KXtpZih5IT0kYnJlYWspe3Rocm93IHl9fXJldHVybiB0aGlzfWZ1bmN0aW9uIHIoeix5LHgpe3ZhciB3PS16LEE9W10sQj10aGlzLnRvQXJyYXkoKTtpZih6PDEpe3JldHVybiBCfXdoaWxlKCh3Kz16KTxCLmxlbmd0aCl7QS5wdXNoKEIuc2xpY2Uodyx3K3opKX1yZXR1cm4gQS5jb2xsZWN0KHkseCl9ZnVuY3Rpb24gYih5LHgpe3k9eXx8UHJvdG90eXBlLks7dmFyIHc9dHJ1ZTt0aGlzLmVhY2goZnVuY3Rpb24oQSx6KXt3PXcmJiEheS5jYWxsKHgsQSx6LHRoaXMpO2lmKCF3KXt0aHJvdyAkYnJlYWt9fSx0aGlzKTtyZXR1cm4gd31mdW5jdGlvbiBpKHkseCl7eT15fHxQcm90b3R5cGUuSzt2YXIgdz1mYWxzZTt0aGlzLmVhY2goZnVuY3Rpb24oQSx6KXtpZih3PSEheS5jYWxsKHgsQSx6LHRoaXMpKXt0aHJvdyAkYnJlYWt9fSx0aGlzKTtyZXR1cm4gd31mdW5jdGlvbiBqKHkseCl7eT15fHxQcm90b3R5cGUuSzt2YXIgdz1bXTt0aGlzLmVhY2goZnVuY3Rpb24oQSx6KXt3LnB1c2goeS5jYWxsKHgsQSx6LHRoaXMpKX0sdGhpcyk7cmV0dXJuIHd9ZnVuY3Rpb24gdCh5LHgpe3ZhciB3O3RoaXMuZWFjaChmdW5jdGlvbihBLHope2lmKHkuY2FsbCh4LEEseix0aGlzKSl7dz1BO3Rocm93ICRicmVha319LHRoaXMpO3JldHVybiB3fWZ1bmN0aW9uIGgoeSx4KXt2YXIgdz1bXTt0aGlzLmVhY2goZnVuY3Rpb24oQSx6KXtpZih5LmNhbGwoeCxBLHosdGhpcykpe3cucHVzaChBKX19LHRoaXMpO3JldHVybiB3fWZ1bmN0aW9uIGcoeix5LHgpe3k9eXx8UHJvdG90eXBlLks7dmFyIHc9W107aWYoT2JqZWN0LmlzU3RyaW5nKHopKXt6PW5ldyBSZWdFeHAoUmVnRXhwLmVzY2FwZSh6KSl9dGhpcy5lYWNoKGZ1bmN0aW9uKEIsQSl7aWYoei5tYXRjaChCKSl7dy5wdXNoKHkuY2FsbCh4LEIsQSx0aGlzKSl9fSx0aGlzKTtyZXR1cm4gd31mdW5jdGlvbiBhKHcpe2lmKE9iamVjdC5pc0Z1bmN0aW9uKHRoaXMuaW5kZXhPZikmJnRoaXMuaW5kZXhPZih3KSE9LTEpe3JldHVybiB0cnVlfXZhciB4PWZhbHNlO3RoaXMuZWFjaChmdW5jdGlvbih5KXtpZih5PT13KXt4PXRydWU7dGhyb3cgJGJyZWFrfX0pO3JldHVybiB4fWZ1bmN0aW9uIHEoeCx3KXt3PU9iamVjdC5pc1VuZGVmaW5lZCh3KT9udWxsOnc7cmV0dXJuIHRoaXMuZWFjaFNsaWNlKHgsZnVuY3Rpb24oeSl7d2hpbGUoeS5sZW5ndGg8eCl7eS5wdXNoKHcpfXJldHVybiB5fSl9ZnVuY3Rpb24gbCh3LHkseCl7dGhpcy5lYWNoKGZ1bmN0aW9uKEEseil7dz15LmNhbGwoeCx3LEEseix0aGlzKX0sdGhpcyk7cmV0dXJuIHd9ZnVuY3Rpb24gdih4KXt2YXIgdz0kQShhcmd1bWVudHMpLnNsaWNlKDEpO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbih5KXtyZXR1cm4geVt4XS5hcHBseSh5LHcpfSl9ZnVuY3Rpb24gcCh5LHgpe3k9eXx8UHJvdG90eXBlLks7dmFyIHc7dGhpcy5lYWNoKGZ1bmN0aW9uKEEseil7QT15LmNhbGwoeCxBLHosdGhpcyk7aWYodz09bnVsbHx8QT49dyl7dz1BfX0sdGhpcyk7cmV0dXJuIHd9ZnVuY3Rpb24gbih5LHgpe3k9eXx8UHJvdG90eXBlLks7dmFyIHc7dGhpcy5lYWNoKGZ1bmN0aW9uKEEseil7QT15LmNhbGwoeCxBLHosdGhpcyk7aWYodz09bnVsbHx8QTx3KXt3PUF9fSx0aGlzKTtyZXR1cm4gd31mdW5jdGlvbiBlKHoseCl7ej16fHxQcm90b3R5cGUuSzt2YXIgeT1bXSx3PVtdO3RoaXMuZWFjaChmdW5jdGlvbihCLEEpeyh6LmNhbGwoeCxCLEEsdGhpcyk/eTp3KS5wdXNoKEIpfSx0aGlzKTtyZXR1cm5beSx3XX1mdW5jdGlvbiBmKHgpe3ZhciB3PVtdO3RoaXMuZWFjaChmdW5jdGlvbih5KXt3LnB1c2goeVt4XSl9KTtyZXR1cm4gd31mdW5jdGlvbiBkKHkseCl7dmFyIHc9W107dGhpcy5lYWNoKGZ1bmN0aW9uKEEseil7aWYoIXkuY2FsbCh4LEEseix0aGlzKSl7dy5wdXNoKEEpfX0sdGhpcyk7cmV0dXJuIHd9ZnVuY3Rpb24gbSh4LHcpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbih6LHkpe3JldHVybnt2YWx1ZTp6LGNyaXRlcmlhOnguY2FsbCh3LHoseSx0aGlzKX19LHRoaXMpLnNvcnQoZnVuY3Rpb24oQixBKXt2YXIgej1CLmNyaXRlcmlhLHk9QS5jcml0ZXJpYTtyZXR1cm4gejx5Py0xOno+eT8xOjB9KS5wbHVjaygidmFsdWUiKX1mdW5jdGlvbiBvKCl7cmV0dXJuIHRoaXMubWFwKCl9ZnVuY3Rpb24gcygpe3ZhciB4PVByb3RvdHlwZS5LLHc9JEEoYXJndW1lbnRzKTtpZihPYmplY3QuaXNGdW5jdGlvbih3Lmxhc3QoKSkpe3g9dy5wb3AoKX12YXIgeT1bdGhpc10uY29uY2F0KHcpLm1hcCgkQSk7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKEEseil7cmV0dXJuIHgoeS5wbHVjayh6KSl9KX1mdW5jdGlvbiBrKCl7cmV0dXJuIHRoaXMudG9BcnJheSgpLmxlbmd0aH1mdW5jdGlvbiB1KCl7cmV0dXJuIiM8RW51bWVyYWJsZToiK3RoaXMudG9BcnJheSgpLmluc3BlY3QoKSsiPiJ9cmV0dXJue2VhY2g6YyxlYWNoU2xpY2U6cixhbGw6YixldmVyeTpiLGFueTppLHNvbWU6aSxjb2xsZWN0OmosbWFwOmosZGV0ZWN0OnQsZmluZEFsbDpoLHNlbGVjdDpoLGZpbHRlcjpoLGdyZXA6ZyxpbmNsdWRlOmEsbWVtYmVyOmEsaW5Hcm91cHNPZjpxLGluamVjdDpsLGludm9rZTp2LG1heDpwLG1pbjpuLHBhcnRpdGlvbjplLHBsdWNrOmYscmVqZWN0OmQsc29ydEJ5Om0sdG9BcnJheTpvLGVudHJpZXM6byx6aXA6cyxzaXplOmssaW5zcGVjdDp1LGZpbmQ6dH19KSgpO2Z1bmN0aW9uICRBKGMpe2lmKCFjKXtyZXR1cm5bXX1pZigidG9BcnJheSIgaW4gT2JqZWN0KGMpKXtyZXR1cm4gYy50b0FycmF5KCl9dmFyIGI9Yy5sZW5ndGh8fDAsYT1uZXcgQXJyYXkoYik7d2hpbGUoYi0tKXthW2JdPWNbYl19cmV0dXJuIGF9ZnVuY3Rpb24gJHcoYSl7aWYoIU9iamVjdC5pc1N0cmluZyhhKSl7cmV0dXJuW119YT1hLnN0cmlwKCk7cmV0dXJuIGE/YS5zcGxpdCgvXHMrLyk6W119QXJyYXkuZnJvbT0kQTsoZnVuY3Rpb24oKXt2YXIgdj1BcnJheS5wcm90b3R5cGUsbz12LnNsaWNlLHE9di5mb3JFYWNoO2Z1bmN0aW9uIGIoQixBKXtmb3IodmFyIHo9MCxDPXRoaXMubGVuZ3RoPj4+MDt6PEM7eisrKXtpZih6IGluIHRoaXMpe0IuY2FsbChBLHRoaXNbel0seix0aGlzKX19fWlmKCFxKXtxPWJ9ZnVuY3Rpb24gbigpe3RoaXMubGVuZ3RoPTA7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gZCgpe3JldHVybiB0aGlzWzBdfWZ1bmN0aW9uIGcoKXtyZXR1cm4gdGhpc1t0aGlzLmxlbmd0aC0xXX1mdW5jdGlvbiBrKCl7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKHope3JldHVybiB6IT1udWxsfSl9ZnVuY3Rpb24geSgpe3JldHVybiB0aGlzLmluamVjdChbXSxmdW5jdGlvbihBLHope2lmKE9iamVjdC5pc0FycmF5KHopKXtyZXR1cm4gQS5jb25jYXQoei5mbGF0dGVuKCkpfUEucHVzaCh6KTtyZXR1cm4gQX0pfWZ1bmN0aW9uIGooKXt2YXIgej1vLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbihBKXtyZXR1cm4gIXouaW5jbHVkZShBKX0pfWZ1bmN0aW9uIGYoeil7cmV0dXJuKHo9PT1mYWxzZT90aGlzLnRvQXJyYXkoKTp0aGlzKS5fcmV2ZXJzZSgpfWZ1bmN0aW9uIG0oeil7cmV0dXJuIHRoaXMuaW5qZWN0KFtdLGZ1bmN0aW9uKEMsQixBKXtpZigwPT1BfHwoej9DLmxhc3QoKSE9QjohQy5pbmNsdWRlKEIpKSl7Qy5wdXNoKEIpfXJldHVybiBDfSl9ZnVuY3Rpb24gcih6KXtyZXR1cm4gdGhpcy51bmlxKCkuZmluZEFsbChmdW5jdGlvbihBKXtyZXR1cm4gei5pbmRleE9mKEEpIT09LTF9KX1mdW5jdGlvbiB0KCl7cmV0dXJuIG8uY2FsbCh0aGlzLDApfWZ1bmN0aW9uIGwoKXtyZXR1cm4gdGhpcy5sZW5ndGh9ZnVuY3Rpb24gdygpe3JldHVybiJbIit0aGlzLm1hcChPYmplY3QuaW5zcGVjdCkuam9pbigiLCAiKSsiXSJ9ZnVuY3Rpb24gYShDLEEpe2lmKHRoaXM9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoKX12YXIgRD1PYmplY3QodGhpcyksQj1ELmxlbmd0aD4+PjA7aWYoQj09PTApe3JldHVybiAtMX1BPU51bWJlcihBKTtpZihpc05hTihBKSl7QT0wfWVsc2V7aWYoQSE9PTAmJmlzRmluaXRlKEEpKXtBPShBPjA/MTotMSkqTWF0aC5mbG9vcihNYXRoLmFicyhBKSl9fWlmKEE+Qil7cmV0dXJuIC0xfXZhciB6PUE+PTA/QTpNYXRoLm1heChCLU1hdGguYWJzKEEpLDApO2Zvcig7ejxCO3orKyl7aWYoeiBpbiBEJiZEW3pdPT09Qyl7cmV0dXJuIHp9fXJldHVybiAtMX1mdW5jdGlvbiBwKEMsQSl7aWYodGhpcz09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcigpfXZhciBEPU9iamVjdCh0aGlzKSxCPUQubGVuZ3RoPj4+MDtpZihCPT09MCl7cmV0dXJuIC0xfWlmKCFPYmplY3QuaXNVbmRlZmluZWQoQSkpe0E9TnVtYmVyKEEpO2lmKGlzTmFOKEEpKXtBPTB9ZWxzZXtpZihBIT09MCYmaXNGaW5pdGUoQSkpe0E9KEE+MD8xOi0xKSpNYXRoLmZsb29yKE1hdGguYWJzKEEpKX19fWVsc2V7QT1CfXZhciB6PUE+PTA/TWF0aC5taW4oQSxCLTEpOkItTWF0aC5hYnMoQSk7Zm9yKDt6Pj0wO3otLSl7aWYoeiBpbiBEJiZEW3pdPT09Qyl7cmV0dXJuIHp9fXJldHVybiAtMX1mdW5jdGlvbiBjKEcpe3ZhciBFPVtdLEY9by5jYWxsKGFyZ3VtZW50cywwKSxILEE9MDtGLnVuc2hpZnQodGhpcyk7Zm9yKHZhciBEPTAsej1GLmxlbmd0aDtEPHo7RCsrKXtIPUZbRF07aWYoT2JqZWN0LmlzQXJyYXkoSCkmJiEoImNhbGxlZSIgaW4gSCkpe2Zvcih2YXIgQz0wLEI9SC5sZW5ndGg7QzxCO0MrKyl7aWYoQyBpbiBIKXtFW0FdPUhbQ119QSsrfX1lbHNle0VbQSsrXT1IfX1FLmxlbmd0aD1BO3JldHVybiBFfWZ1bmN0aW9uIHMoeil7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3JldHVybiB6LmNhbGwodGhpcyxQcm90b3R5cGUuSyl9ZWxzZXtpZihhcmd1bWVudHNbMF09PT11bmRlZmluZWQpe3ZhciBBPW8uY2FsbChhcmd1bWVudHMsMSk7QS51bnNoaWZ0KFByb3RvdHlwZS5LKTtyZXR1cm4gei5hcHBseSh0aGlzLEEpfWVsc2V7cmV0dXJuIHouYXBwbHkodGhpcyxhcmd1bWVudHMpfX19fWZ1bmN0aW9uIHUoRCl7aWYodGhpcz09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcigpfUQ9RHx8UHJvdG90eXBlLks7dmFyIHo9T2JqZWN0KHRoaXMpO3ZhciBDPVtdLEI9YXJndW1lbnRzWzFdLEY9MDtmb3IodmFyIEE9MCxFPXoubGVuZ3RoPj4+MDtBPEU7QSsrKXtpZihBIGluIHope0NbRl09RC5jYWxsKEIseltBXSxBLHopfUYrK31DLmxlbmd0aD1GO3JldHVybiBDfWlmKHYubWFwKXt1PXMoQXJyYXkucHJvdG90eXBlLm1hcCl9ZnVuY3Rpb24gaChEKXtpZih0aGlzPT1udWxsfHwhT2JqZWN0LmlzRnVuY3Rpb24oRCkpe3Rocm93IG5ldyBUeXBlRXJyb3IoKX12YXIgej1PYmplY3QodGhpcyk7dmFyIEM9W10sQj1hcmd1bWVudHNbMV0sRjtmb3IodmFyIEE9MCxFPXoubGVuZ3RoPj4+MDtBPEU7QSsrKXtpZihBIGluIHope0Y9eltBXTtpZihELmNhbGwoQixGLEEseikpe0MucHVzaChGKX19fXJldHVybiBDfWlmKHYuZmlsdGVyKXtoPUFycmF5LnByb3RvdHlwZS5maWx0ZXJ9ZnVuY3Rpb24gaShDKXtpZih0aGlzPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKCl9Qz1DfHxQcm90b3R5cGUuSzt2YXIgQj1hcmd1bWVudHNbMV07dmFyIHo9T2JqZWN0KHRoaXMpO2Zvcih2YXIgQT0wLEQ9ei5sZW5ndGg+Pj4wO0E8RDtBKyspe2lmKEEgaW4geiYmQy5jYWxsKEIseltBXSxBLHopKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfWlmKHYuc29tZSl7aT1zKEFycmF5LnByb3RvdHlwZS5zb21lKX1mdW5jdGlvbiB4KEMpe2lmKHRoaXM9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoKX1DPUN8fFByb3RvdHlwZS5LO3ZhciBCPWFyZ3VtZW50c1sxXTt2YXIgej1PYmplY3QodGhpcyk7Zm9yKHZhciBBPTAsRD16Lmxlbmd0aD4+PjA7QTxEO0ErKyl7aWYoQSBpbiB6JiYhQy5jYWxsKEIseltBXSxBLHopKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfWlmKHYuZXZlcnkpe3g9cyhBcnJheS5wcm90b3R5cGUuZXZlcnkpfU9iamVjdC5leHRlbmQodixFbnVtZXJhYmxlKTtpZih2LmVudHJpZXM9PT1FbnVtZXJhYmxlLmVudHJpZXMpe2RlbGV0ZSB2LmVudHJpZXN9aWYoIXYuX3JldmVyc2Upe3YuX3JldmVyc2U9di5yZXZlcnNlfU9iamVjdC5leHRlbmQodix7X2VhY2g6cSxtYXA6dSxjb2xsZWN0OnUsc2VsZWN0OmgsZmlsdGVyOmgsZmluZEFsbDpoLHNvbWU6aSxhbnk6aSxldmVyeTp4LGFsbDp4LGNsZWFyOm4sZmlyc3Q6ZCxsYXN0OmcsY29tcGFjdDprLGZsYXR0ZW46eSx3aXRob3V0OmoscmV2ZXJzZTpmLHVuaXE6bSxpbnRlcnNlY3Q6cixjbG9uZTp0LHRvQXJyYXk6dCxzaXplOmwsaW5zcGVjdDp3fSk7dmFyIGU9KGZ1bmN0aW9uKCl7cmV0dXJuW10uY29uY2F0KGFyZ3VtZW50cylbMF1bMF0hPT0xfSkoMSwyKTtpZihlKXt2LmNvbmNhdD1jfWlmKCF2LmluZGV4T2Ype3YuaW5kZXhPZj1hfWlmKCF2Lmxhc3RJbmRleE9mKXt2Lmxhc3RJbmRleE9mPXB9fSkoKTtmdW5jdGlvbiAkSChhKXtyZXR1cm4gbmV3IEhhc2goYSl9dmFyIEhhc2g9Q2xhc3MuY3JlYXRlKEVudW1lcmFibGUsKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShwKXt0aGlzLl9vYmplY3Q9T2JqZWN0LmlzSGFzaChwKT9wLnRvT2JqZWN0KCk6T2JqZWN0LmNsb25lKHApfWZ1bmN0aW9uIGYocyxyKXt2YXIgcT0wO2Zvcih2YXIgcCBpbiB0aGlzLl9vYmplY3Qpe3ZhciB0PXRoaXMuX29iamVjdFtwXSx1PVtwLHRdO3Uua2V5PXA7dS52YWx1ZT10O3MuY2FsbChyLHUscSk7cSsrfX1mdW5jdGlvbiBqKHAscSl7cmV0dXJuIHRoaXMuX29iamVjdFtwXT1xfWZ1bmN0aW9uIGMocCl7aWYodGhpcy5fb2JqZWN0W3BdIT09T2JqZWN0LnByb3RvdHlwZVtwXSl7cmV0dXJuIHRoaXMuX29iamVjdFtwXX19ZnVuY3Rpb24gbShwKXt2YXIgcT10aGlzLl9vYmplY3RbcF07ZGVsZXRlIHRoaXMuX29iamVjdFtwXTtyZXR1cm4gcX1mdW5jdGlvbiBvKCl7cmV0dXJuIE9iamVjdC5jbG9uZSh0aGlzLl9vYmplY3QpfWZ1bmN0aW9uIG4oKXtyZXR1cm4gdGhpcy5wbHVjaygia2V5Iil9ZnVuY3Rpb24gbCgpe3JldHVybiB0aGlzLnBsdWNrKCJ2YWx1ZSIpfWZ1bmN0aW9uIGcocSl7dmFyIHA9dGhpcy5kZXRlY3QoZnVuY3Rpb24ocil7cmV0dXJuIHIudmFsdWU9PT1xfSk7cmV0dXJuIHAmJnAua2V5fWZ1bmN0aW9uIGkocCl7cmV0dXJuIHRoaXMuY2xvbmUoKS51cGRhdGUocCl9ZnVuY3Rpb24gZChwKXtyZXR1cm4gbmV3IEhhc2gocCkuaW5qZWN0KHRoaXMsZnVuY3Rpb24ocSxyKXtxLnNldChyLmtleSxyLnZhbHVlKTtyZXR1cm4gcX0pfWZ1bmN0aW9uIGIocCxxKXtpZihPYmplY3QuaXNVbmRlZmluZWQocSkpe3JldHVybiBwfXE9U3RyaW5nLmludGVycHJldChxKTtxPXEuZ3N1YigvKFxyKT9cbi8sIlxyXG4iKTtxPWVuY29kZVVSSUNvbXBvbmVudChxKTtxPXEuZ3N1YigvJTIwLywiKyIpO3JldHVybiBwKyI9IitxfWZ1bmN0aW9uIGEoKXtyZXR1cm4gdGhpcy5pbmplY3QoW10sZnVuY3Rpb24odCx3KXt2YXIgcz1lbmNvZGVVUklDb21wb25lbnQody5rZXkpLHE9dy52YWx1ZTtpZihxJiZ0eXBlb2YgcT09Im9iamVjdCIpe2lmKE9iamVjdC5pc0FycmF5KHEpKXt2YXIgdj1bXTtmb3IodmFyIHI9MCxwPXEubGVuZ3RoLHU7cjxwO3IrKyl7dT1xW3JdO3YucHVzaChiKHMsdSkpfXJldHVybiB0LmNvbmNhdCh2KX19ZWxzZXt0LnB1c2goYihzLHEpKX1yZXR1cm4gdH0pLmpvaW4oIiYiKX1mdW5jdGlvbiBrKCl7cmV0dXJuIiM8SGFzaDp7Iit0aGlzLm1hcChmdW5jdGlvbihwKXtyZXR1cm4gcC5tYXAoT2JqZWN0Lmluc3BlY3QpLmpvaW4oIjogIil9KS5qb2luKCIsICIpKyJ9PiJ9ZnVuY3Rpb24gaCgpe3JldHVybiBuZXcgSGFzaCh0aGlzKX1yZXR1cm57aW5pdGlhbGl6ZTplLF9lYWNoOmYsc2V0OmosZ2V0OmMsdW5zZXQ6bSx0b09iamVjdDpvLHRvVGVtcGxhdGVSZXBsYWNlbWVudHM6byxrZXlzOm4sdmFsdWVzOmwsaW5kZXg6ZyxtZXJnZTppLHVwZGF0ZTpkLHRvUXVlcnlTdHJpbmc6YSxpbnNwZWN0OmssdG9KU09OOm8sY2xvbmU6aH19KSgpKTtIYXNoLmZyb209JEg7T2JqZWN0LmV4dGVuZChOdW1iZXIucHJvdG90eXBlLChmdW5jdGlvbigpe2Z1bmN0aW9uIGQoKXtyZXR1cm4gdGhpcy50b1BhZGRlZFN0cmluZygyLDE2KX1mdW5jdGlvbiBiKCl7cmV0dXJuIHRoaXMrMX1mdW5jdGlvbiBoKGosaSl7JFIoMCx0aGlzLHRydWUpLmVhY2goaixpKTtyZXR1cm4gdGhpc31mdW5jdGlvbiBnKGssail7dmFyIGk9dGhpcy50b1N0cmluZyhqfHwxMCk7cmV0dXJuIjAiLnRpbWVzKGstaS5sZW5ndGgpK2l9ZnVuY3Rpb24gYSgpe3JldHVybiBNYXRoLmFicyh0aGlzKX1mdW5jdGlvbiBjKCl7cmV0dXJuIE1hdGgucm91bmQodGhpcyl9ZnVuY3Rpb24gZSgpe3JldHVybiBNYXRoLmNlaWwodGhpcyl9ZnVuY3Rpb24gZigpe3JldHVybiBNYXRoLmZsb29yKHRoaXMpfXJldHVybnt0b0NvbG9yUGFydDpkLHN1Y2M6Yix0aW1lczpoLHRvUGFkZGVkU3RyaW5nOmcsYWJzOmEscm91bmQ6YyxjZWlsOmUsZmxvb3I6Zn19KSgpKTtmdW5jdGlvbiAkUihjLGEsYil7cmV0dXJuIG5ldyBPYmplY3RSYW5nZShjLGEsYil9dmFyIE9iamVjdFJhbmdlPUNsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLChmdW5jdGlvbigpe2Z1bmN0aW9uIGIoZixkLGUpe3RoaXMuc3RhcnQ9Zjt0aGlzLmVuZD1kO3RoaXMuZXhjbHVzaXZlPWV9ZnVuY3Rpb24gYyhmLGUpe3ZhciBnPXRoaXMuc3RhcnQsZDtmb3IoZD0wO3RoaXMuaW5jbHVkZShnKTtkKyspe2YuY2FsbChlLGcsZCk7Zz1nLnN1Y2MoKX19ZnVuY3Rpb24gYShkKXtpZihkPHRoaXMuc3RhcnQpe3JldHVybiBmYWxzZX1pZih0aGlzLmV4Y2x1c2l2ZSl7cmV0dXJuIGQ8dGhpcy5lbmR9cmV0dXJuIGQ8PXRoaXMuZW5kfXJldHVybntpbml0aWFsaXplOmIsX2VhY2g6YyxpbmNsdWRlOmF9fSkoKSk7dmFyIEFic3RyYWN0PXt9O3ZhciBUcnk9e3RoZXNlOmZ1bmN0aW9uKCl7dmFyIGM7Zm9yKHZhciBiPTAsZD1hcmd1bWVudHMubGVuZ3RoO2I8ZDtiKyspe3ZhciBhPWFyZ3VtZW50c1tiXTt0cnl7Yz1hKCk7YnJlYWt9Y2F0Y2goZil7fX1yZXR1cm4gY319O3ZhciBBamF4PXtnZXRUcmFuc3BvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gVHJ5LnRoZXNlKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpfSxmdW5jdGlvbigpe3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgiTXN4bWwyLlhNTEhUVFAiKX0sZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9KXx8ZmFsc2V9LGFjdGl2ZVJlcXVlc3RDb3VudDowfTtBamF4LlJlc3BvbmRlcnM9e3Jlc3BvbmRlcnM6W10sX2VhY2g6ZnVuY3Rpb24oYixhKXt0aGlzLnJlc3BvbmRlcnMuX2VhY2goYixhKX0scmVnaXN0ZXI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuaW5jbHVkZShhKSl7dGhpcy5yZXNwb25kZXJzLnB1c2goYSl9fSx1bnJlZ2lzdGVyOmZ1bmN0aW9uKGEpe3RoaXMucmVzcG9uZGVycz10aGlzLnJlc3BvbmRlcnMud2l0aG91dChhKX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZCxiLGMsYSl7dGhpcy5lYWNoKGZ1bmN0aW9uKGYpe2lmKE9iamVjdC5pc0Z1bmN0aW9uKGZbZF0pKXt0cnl7ZltkXS5hcHBseShmLFtiLGMsYV0pfWNhdGNoKGcpe319fSl9fTtPYmplY3QuZXh0ZW5kKEFqYXguUmVzcG9uZGVycyxFbnVtZXJhYmxlKTtBamF4LlJlc3BvbmRlcnMucmVnaXN0ZXIoe29uQ3JlYXRlOmZ1bmN0aW9uKCl7QWpheC5hY3RpdmVSZXF1ZXN0Q291bnQrK30sb25Db21wbGV0ZTpmdW5jdGlvbigpe0FqYXguYWN0aXZlUmVxdWVzdENvdW50LS19fSk7QWpheC5CYXNlPUNsYXNzLmNyZWF0ZSh7aW5pdGlhbGl6ZTpmdW5jdGlvbihhKXt0aGlzLm9wdGlvbnM9e21ldGhvZDoicG9zdCIsYXN5bmNocm9ub3VzOnRydWUsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsZW5jb2Rpbmc6IlVURi04IixwYXJhbWV0ZXJzOiIiLGV2YWxKU09OOnRydWUsZXZhbEpTOnRydWV9O09iamVjdC5leHRlbmQodGhpcy5vcHRpb25zLGF8fHt9KTt0aGlzLm9wdGlvbnMubWV0aG9kPXRoaXMub3B0aW9ucy5tZXRob2QudG9Mb3dlckNhc2UoKTtpZihPYmplY3QuaXNIYXNoKHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzKSl7dGhpcy5vcHRpb25zLnBhcmFtZXRlcnM9dGhpcy5vcHRpb25zLnBhcmFtZXRlcnMudG9PYmplY3QoKX19fSk7QWpheC5SZXF1ZXN0PUNsYXNzLmNyZWF0ZShBamF4LkJhc2Use19jb21wbGV0ZTpmYWxzZSxpbml0aWFsaXplOmZ1bmN0aW9uKCRzdXBlcixiLGEpeyRzdXBlcihhKTt0aGlzLnRyYW5zcG9ydD1BamF4LmdldFRyYW5zcG9ydCgpO3RoaXMucmVxdWVzdChiKX0scmVxdWVzdDpmdW5jdGlvbihiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPXRoaXMub3B0aW9ucy5tZXRob2Q7dmFyIGQ9T2JqZWN0LmlzU3RyaW5nKHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzKT90aGlzLm9wdGlvbnMucGFyYW1ldGVyczpPYmplY3QudG9RdWVyeVN0cmluZyh0aGlzLm9wdGlvbnMucGFyYW1ldGVycyk7aWYoIVsiZ2V0IiwicG9zdCJdLmluY2x1ZGUodGhpcy5tZXRob2QpKXtkKz0oZD8iJiI6IiIpKyJfbWV0aG9kPSIrdGhpcy5tZXRob2Q7dGhpcy5tZXRob2Q9InBvc3QifWlmKGQmJnRoaXMubWV0aG9kPT09ImdldCIpe3RoaXMudXJsKz0odGhpcy51cmwuaW5jbHVkZSgiPyIpPyImIjoiPyIpK2R9dGhpcy5wYXJhbWV0ZXJzPWQudG9RdWVyeVBhcmFtcygpO3RyeXt2YXIgYT1uZXcgQWpheC5SZXNwb25zZSh0aGlzKTtpZih0aGlzLm9wdGlvbnMub25DcmVhdGUpe3RoaXMub3B0aW9ucy5vbkNyZWF0ZShhKX1BamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goIm9uQ3JlYXRlIix0aGlzLGEpO3RoaXMudHJhbnNwb3J0Lm9wZW4odGhpcy5tZXRob2QudG9VcHBlckNhc2UoKSx0aGlzLnVybCx0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzKTtpZih0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzKXt0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUuYmluZCh0aGlzKS5kZWZlcigxKX10aGlzLnRyYW5zcG9ydC5vbnJlYWR5c3RhdGVjaGFuZ2U9dGhpcy5vblN0YXRlQ2hhbmdlLmJpbmQodGhpcyk7dGhpcy5zZXRSZXF1ZXN0SGVhZGVycygpO3RoaXMuYm9keT10aGlzLm1ldGhvZD09InBvc3QiPyh0aGlzLm9wdGlvbnMucG9zdEJvZHl8fGQpOm51bGw7dGhpcy50cmFuc3BvcnQuc2VuZCh0aGlzLmJvZHkpO2lmKCF0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzJiZ0aGlzLnRyYW5zcG9ydC5vdmVycmlkZU1pbWVUeXBlKXt0aGlzLm9uU3RhdGVDaGFuZ2UoKX19Y2F0Y2goYyl7dGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihjKX19LG9uU3RhdGVDaGFuZ2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnRyYW5zcG9ydC5yZWFkeVN0YXRlO2lmKGE+MSYmISgoYT09NCkmJnRoaXMuX2NvbXBsZXRlKSl7dGhpcy5yZXNwb25kVG9SZWFkeVN0YXRlKHRoaXMudHJhbnNwb3J0LnJlYWR5U3RhdGUpfX0sc2V0UmVxdWVzdEhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT17IlgtUmVxdWVzdGVkLVdpdGgiOiJYTUxIdHRwUmVxdWVzdCIsIlgtUHJvdG90eXBlLVZlcnNpb24iOlByb3RvdHlwZS5WZXJzaW9uLEFjY2VwdDoidGV4dC9qYXZhc2NyaXB0LCB0ZXh0L2h0bWwsIGFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwsICovKiJ9O2lmKHRoaXMubWV0aG9kPT0icG9zdCIpe2VbIkNvbnRlbnQtdHlwZSJdPXRoaXMub3B0aW9ucy5jb250ZW50VHlwZSsodGhpcy5vcHRpb25zLmVuY29kaW5nPyI7IGNoYXJzZXQ9Iit0aGlzLm9wdGlvbnMuZW5jb2Rpbmc6IiIpO2lmKHRoaXMudHJhbnNwb3J0Lm92ZXJyaWRlTWltZVR5cGUmJihuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9HZWNrb1wvKFxkezR9KS8pfHxbMCwyMDA1XSlbMV08MjAwNSl7ZS5Db25uZWN0aW9uPSJjbG9zZSJ9fWlmKHR5cGVvZiB0aGlzLm9wdGlvbnMucmVxdWVzdEhlYWRlcnM9PSJvYmplY3QiKXt2YXIgYz10aGlzLm9wdGlvbnMucmVxdWVzdEhlYWRlcnM7aWYoT2JqZWN0LmlzRnVuY3Rpb24oYy5wdXNoKSl7Zm9yKHZhciBiPTAsZD1jLmxlbmd0aDtiPGQ7Yis9Mil7ZVtjW2JdXT1jW2IrMV19fWVsc2V7JEgoYykuZWFjaChmdW5jdGlvbihmKXtlW2Yua2V5XT1mLnZhbHVlfSl9fWZvcih2YXIgYSBpbiBlKXtpZihlW2FdIT1udWxsKXt0aGlzLnRyYW5zcG9ydC5zZXRSZXF1ZXN0SGVhZGVyKGEsZVthXSl9fX0sc3VjY2VzczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0U3RhdHVzKCk7cmV0dXJuICFhfHwoYT49MjAwJiZhPDMwMCl8fGE9PTMwNH0sZ2V0U3RhdHVzOmZ1bmN0aW9uKCl7dHJ5e2lmKHRoaXMudHJhbnNwb3J0LnN0YXR1cz09PTEyMjMpe3JldHVybiAyMDR9cmV0dXJuIHRoaXMudHJhbnNwb3J0LnN0YXR1c3x8MH1jYXRjaChhKXtyZXR1cm4gMH19LHJlc3BvbmRUb1JlYWR5U3RhdGU6ZnVuY3Rpb24oYSl7dmFyIGM9QWpheC5SZXF1ZXN0LkV2ZW50c1thXSxiPW5ldyBBamF4LlJlc3BvbnNlKHRoaXMpO2lmKGM9PSJDb21wbGV0ZSIpe3RyeXt0aGlzLl9jb21wbGV0ZT10cnVlOyh0aGlzLm9wdGlvbnNbIm9uIitiLnN0YXR1c118fHRoaXMub3B0aW9uc1sib24iKyh0aGlzLnN1Y2Nlc3MoKT8iU3VjY2VzcyI6IkZhaWx1cmUiKV18fFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKShiLGIuaGVhZGVySlNPTil9Y2F0Y2goZCl7dGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihkKX12YXIgZj1iLmdldEhlYWRlcigiQ29udGVudC10eXBlIik7aWYodGhpcy5vcHRpb25zLmV2YWxKUz09ImZvcmNlInx8KHRoaXMub3B0aW9ucy5ldmFsSlMmJnRoaXMuaXNTYW1lT3JpZ2luKCkmJmYmJmYubWF0Y2goL15ccyoodGV4dHxhcHBsaWNhdGlvbilcLyh4LSk/KGphdmF8ZWNtYSlzY3JpcHQoOy4qKT9ccyokL2kpKSl7dGhpcy5ldmFsUmVzcG9uc2UoKX19dHJ5eyh0aGlzLm9wdGlvbnNbIm9uIitjXXx8UHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pKGIsYi5oZWFkZXJKU09OKTtBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goIm9uIitjLHRoaXMsYixiLmhlYWRlckpTT04pfWNhdGNoKGQpe3RoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZCl9aWYoYz09IkNvbXBsZXRlIil7dGhpcy50cmFuc3BvcnQub25yZWFkeXN0YXRlY2hhbmdlPVByb3RvdHlwZS5lbXB0eUZ1bmN0aW9ufX0saXNTYW1lT3JpZ2luOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51cmwubWF0Y2goL15ccypodHRwcz86XC9cL1teXC9dKi8pO3JldHVybiAhYXx8KGFbMF09PSIje3Byb3RvY29sfS8vI3tkb21haW59I3twb3J0fSIuaW50ZXJwb2xhdGUoe3Byb3RvY29sOmxvY2F0aW9uLnByb3RvY29sLGRvbWFpbjpkb2N1bWVudC5kb21haW4scG9ydDpsb2NhdGlvbi5wb3J0PyI6Iitsb2NhdGlvbi5wb3J0OiIifSkpfSxnZXRIZWFkZXI6ZnVuY3Rpb24oYSl7dHJ5e3JldHVybiB0aGlzLnRyYW5zcG9ydC5nZXRSZXNwb25zZUhlYWRlcihhKXx8bnVsbH1jYXRjaChiKXtyZXR1cm4gbnVsbH19LGV2YWxSZXNwb25zZTpmdW5jdGlvbigpe3RyeXtyZXR1cm4gZXZhbCgodGhpcy50cmFuc3BvcnQucmVzcG9uc2VUZXh0fHwiIikudW5maWx0ZXJKU09OKCkpfWNhdGNoKGUpe3RoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSl9fSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbihhKXsodGhpcy5vcHRpb25zLm9uRXhjZXB0aW9ufHxQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikodGhpcyxhKTtBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goIm9uRXhjZXB0aW9uIix0aGlzLGEpfX0pO0FqYXguUmVxdWVzdC5FdmVudHM9WyJVbmluaXRpYWxpemVkIiwiTG9hZGluZyIsIkxvYWRlZCIsIkludGVyYWN0aXZlIiwiQ29tcGxldGUiXTtBamF4LlJlc3BvbnNlPUNsYXNzLmNyZWF0ZSh7aW5pdGlhbGl6ZTpmdW5jdGlvbihjKXt0aGlzLnJlcXVlc3Q9Yzt2YXIgZD10aGlzLnRyYW5zcG9ydD1jLnRyYW5zcG9ydCxhPXRoaXMucmVhZHlTdGF0ZT1kLnJlYWR5U3RhdGU7aWYoKGE+MiYmIVByb3RvdHlwZS5Ccm93c2VyLklFKXx8YT09NCl7dGhpcy5zdGF0dXM9dGhpcy5nZXRTdGF0dXMoKTt0aGlzLnN0YXR1c1RleHQ9dGhpcy5nZXRTdGF0dXNUZXh0KCk7dGhpcy5yZXNwb25zZVRleHQ9U3RyaW5nLmludGVycHJldChkLnJlc3BvbnNlVGV4dCk7dGhpcy5oZWFkZXJKU09OPXRoaXMuX2dldEhlYWRlckpTT04oKX1pZihhPT00KXt2YXIgYj1kLnJlc3BvbnNlWE1MO3RoaXMucmVzcG9uc2VYTUw9T2JqZWN0LmlzVW5kZWZpbmVkKGIpP251bGw6Yjt0aGlzLnJlc3BvbnNlSlNPTj10aGlzLl9nZXRSZXNwb25zZUpTT04oKX19LHN0YXR1czowLHN0YXR1c1RleHQ6IiIsZ2V0U3RhdHVzOkFqYXguUmVxdWVzdC5wcm90b3R5cGUuZ2V0U3RhdHVzLGdldFN0YXR1c1RleHQ6ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHRoaXMudHJhbnNwb3J0LnN0YXR1c1RleHR8fCIifWNhdGNoKGEpe3JldHVybiIifX0sZ2V0SGVhZGVyOkFqYXguUmVxdWVzdC5wcm90b3R5cGUuZ2V0SGVhZGVyLGdldEFsbEhlYWRlcnM6ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHRoaXMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCl9Y2F0Y2goYSl7cmV0dXJuIG51bGx9fSxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VIZWFkZXIoYSl9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRyYW5zcG9ydC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKX0sX2dldEhlYWRlckpTT046ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEhlYWRlcigiWC1KU09OIik7aWYoIWEpe3JldHVybiBudWxsfXRyeXthPWRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoYSkpfWNhdGNoKGIpe310cnl7cmV0dXJuIGEuZXZhbEpTT04odGhpcy5yZXF1ZXN0Lm9wdGlvbnMuc2FuaXRpemVKU09OfHwhdGhpcy5yZXF1ZXN0LmlzU2FtZU9yaWdpbigpKX1jYXRjaChiKXt0aGlzLnJlcXVlc3QuZGlzcGF0Y2hFeGNlcHRpb24oYil9fSxfZ2V0UmVzcG9uc2VKU09OOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZXF1ZXN0Lm9wdGlvbnM7aWYoIWEuZXZhbEpTT058fChhLmV2YWxKU09OIT0iZm9yY2UiJiYhKHRoaXMuZ2V0SGVhZGVyKCJDb250ZW50LXR5cGUiKXx8IiIpLmluY2x1ZGUoImFwcGxpY2F0aW9uL2pzb24iKSl8fHRoaXMucmVzcG9uc2VUZXh0LmJsYW5rKCkpe3JldHVybiBudWxsfXRyeXtyZXR1cm4gdGhpcy5yZXNwb25zZVRleHQuZXZhbEpTT04oYS5zYW5pdGl6ZUpTT058fCF0aGlzLnJlcXVlc3QuaXNTYW1lT3JpZ2luKCkpfWNhdGNoKGIpe3RoaXMucmVxdWVzdC5kaXNwYXRjaEV4Y2VwdGlvbihiKX19fSk7QWpheC5VcGRhdGVyPUNsYXNzLmNyZWF0ZShBamF4LlJlcXVlc3Qse2luaXRpYWxpemU6ZnVuY3Rpb24oJHN1cGVyLGEsYyxiKXt0aGlzLmNvbnRhaW5lcj17c3VjY2VzczooYS5zdWNjZXNzfHxhKSxmYWlsdXJlOihhLmZhaWx1cmV8fChhLnN1Y2Nlc3M/bnVsbDphKSl9O2I9T2JqZWN0LmNsb25lKGIpO3ZhciBkPWIub25Db21wbGV0ZTtiLm9uQ29tcGxldGU9KGZ1bmN0aW9uKGUsZil7dGhpcy51cGRhdGVDb250ZW50KGUucmVzcG9uc2VUZXh0KTtpZihPYmplY3QuaXNGdW5jdGlvbihkKSl7ZChlLGYpfX0pLmJpbmQodGhpcyk7JHN1cGVyKGMsYil9LHVwZGF0ZUNvbnRlbnQ6ZnVuY3Rpb24oZCl7dmFyIGM9dGhpcy5jb250YWluZXJbdGhpcy5zdWNjZXNzKCk/InN1Y2Nlc3MiOiJmYWlsdXJlIl0sYT10aGlzLm9wdGlvbnM7aWYoIWEuZXZhbFNjcmlwdHMpe2Q9ZC5zdHJpcFNjcmlwdHMoKX1pZihjPSQoYykpe2lmKGEuaW5zZXJ0aW9uKXtpZihPYmplY3QuaXNTdHJpbmcoYS5pbnNlcnRpb24pKXt2YXIgYj17fTtiW2EuaW5zZXJ0aW9uXT1kO2MuaW5zZXJ0KGIpfWVsc2V7YS5pbnNlcnRpb24oYyxkKX19ZWxzZXtjLnVwZGF0ZShkKX19fX0pO0FqYXguUGVyaW9kaWNhbFVwZGF0ZXI9Q2xhc3MuY3JlYXRlKEFqYXguQmFzZSx7aW5pdGlhbGl6ZTpmdW5jdGlvbigkc3VwZXIsYSxjLGIpeyRzdXBlcihiKTt0aGlzLm9uQ29tcGxldGU9dGhpcy5vcHRpb25zLm9uQ29tcGxldGU7dGhpcy5mcmVxdWVuY3k9KHRoaXMub3B0aW9ucy5mcmVxdWVuY3l8fDIpO3RoaXMuZGVjYXk9KHRoaXMub3B0aW9ucy5kZWNheXx8MSk7dGhpcy51cGRhdGVyPXt9O3RoaXMuY29udGFpbmVyPWE7dGhpcy51cmw9Yzt0aGlzLnN0YXJ0KCl9LHN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9uQ29tcGxldGU9dGhpcy51cGRhdGVDb21wbGV0ZS5iaW5kKHRoaXMpO3RoaXMub25UaW1lckV2ZW50KCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZXIub3B0aW9ucy5vbkNvbXBsZXRlPXVuZGVmaW5lZDtjbGVhclRpbWVvdXQodGhpcy50aW1lcik7KHRoaXMub25Db21wbGV0ZXx8UHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdXBkYXRlQ29tcGxldGU6ZnVuY3Rpb24oYSl7aWYodGhpcy5vcHRpb25zLmRlY2F5KXt0aGlzLmRlY2F5PShhLnJlc3BvbnNlVGV4dD09dGhpcy5sYXN0VGV4dD90aGlzLmRlY2F5KnRoaXMub3B0aW9ucy5kZWNheToxKTt0aGlzLmxhc3RUZXh0PWEucmVzcG9uc2VUZXh0fXRoaXMudGltZXI9dGhpcy5vblRpbWVyRXZlbnQuYmluZCh0aGlzKS5kZWxheSh0aGlzLmRlY2F5KnRoaXMuZnJlcXVlbmN5KX0sb25UaW1lckV2ZW50OmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVyPW5ldyBBamF4LlVwZGF0ZXIodGhpcy5jb250YWluZXIsdGhpcy51cmwsdGhpcy5vcHRpb25zKX19KTsoZnVuY3Rpb24oYTgpe3ZhciBhRTt2YXIgYTE9QXJyYXkucHJvdG90eXBlLnNsaWNlO3ZhciBhdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtmdW5jdGlvbiBhWihicCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IodmFyIEY9MCxicj1bXSxicT1hcmd1bWVudHMubGVuZ3RoO0Y8YnE7RisrKXtici5wdXNoKGFaKGFyZ3VtZW50c1tGXSkpfXJldHVybiBicn1pZihPYmplY3QuaXNTdHJpbmcoYnApKXticD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChicCl9cmV0dXJuIGFGLmV4dGVuZChicCl9YTguJD1hWjtpZighYTguTm9kZSl7YTguTm9kZT17fX1pZighYTguTm9kZS5FTEVNRU5UX05PREUpe09iamVjdC5leHRlbmQoYTguTm9kZSx7RUxFTUVOVF9OT0RFOjEsQVRUUklCVVRFX05PREU6MixURVhUX05PREU6MyxDREFUQV9TRUNUSU9OX05PREU6NCxFTlRJVFlfUkVGRVJFTkNFX05PREU6NSxFTlRJVFlfTk9ERTo2LFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTo3LENPTU1FTlRfTk9ERTo4LERPQ1VNRU5UX05PREU6OSxET0NVTUVOVF9UWVBFX05PREU6MTAsRE9DVU1FTlRfRlJBR01FTlRfTk9ERToxMSxOT1RBVElPTl9OT0RFOjEyfSl9dmFyIHI9e307ZnVuY3Rpb24gYVEoRixpKXtpZihGPT09InNlbGVjdCIpe3JldHVybiBmYWxzZX1pZigidHlwZSIgaW4gaSl7cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfXZhciBkPShmdW5jdGlvbigpe3RyeXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCc8aW5wdXQgbmFtZT0ieCI+Jyk7cmV0dXJuIGkudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmaS5uYW1lPT09IngifWNhdGNoKEYpe3JldHVybiBmYWxzZX19KSgpO3ZhciBhST1hOC5FbGVtZW50O2Z1bmN0aW9uIGFGKEYsaSl7aT1pfHx7fTtGPUYudG9Mb3dlckNhc2UoKTtpZihkJiZpLm5hbWUpe0Y9IjwiK0YrJyBuYW1lPSInK2kubmFtZSsnIj4nO2RlbGV0ZSBpLm5hbWU7cmV0dXJuIGFGLndyaXRlQXR0cmlidXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoRiksaSl9aWYoIXJbRl0pe3JbRl09YUYuZXh0ZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoRikpfXZhciBicD1hUShGLGkpP3JbRl0uY2xvbmVOb2RlKGZhbHNlKTpkb2N1bWVudC5jcmVhdGVFbGVtZW50KEYpO3JldHVybiBhRi53cml0ZUF0dHJpYnV0ZShicCxpKX1hOC5FbGVtZW50PWFGO09iamVjdC5leHRlbmQoYTguRWxlbWVudCxhSXx8e30pO2lmKGFJKXthOC5FbGVtZW50LnByb3RvdHlwZT1hSS5wcm90b3R5cGV9YUYuTWV0aG9kcz17QnlUYWc6e30sU2ltdWxhdGVkOnt9fTt2YXIgYTM9e307dmFyIEg9e2lkOiJpZCIsY2xhc3NOYW1lOiJjbGFzcyJ9O2Z1bmN0aW9uIGJhKEYpe0Y9YVooRik7dmFyIGk9IjwiK0YudGFnTmFtZS50b0xvd2VyQ2FzZSgpO3ZhciBicCxicjtmb3IodmFyIGJxIGluIEgpe2JwPUhbYnFdO2JyPShGW2JxXXx8IiIpLnRvU3RyaW5nKCk7aWYoYnIpe2krPSIgIiticCsiPSIrYnIuaW5zcGVjdCh0cnVlKX19cmV0dXJuIGkrIj4ifWEzLmluc3BlY3Q9YmE7ZnVuY3Rpb24gdihpKXtyZXR1cm4gYVooaSkuZ2V0U3R5bGUoImRpc3BsYXkiKSE9PSJub25lIn1mdW5jdGlvbiBheChGLGkpe0Y9YVooRik7aWYodHlwZW9mIGkhPT0iYm9vbGVhbiIpe2k9IWFGLnZpc2libGUoRil9YUZbaT8ic2hvdyI6ImhpZGUiXShGKTtyZXR1cm4gRn1mdW5jdGlvbiBhSChpKXtpPWFaKGkpO2kuc3R5bGUuZGlzcGxheT0ibm9uZSI7cmV0dXJuIGl9ZnVuY3Rpb24gaihpKXtpPWFaKGkpO2kuc3R5bGUuZGlzcGxheT0iIjtyZXR1cm4gaX1PYmplY3QuZXh0ZW5kKGEzLHt2aXNpYmxlOnYsdG9nZ2xlOmF4LGhpZGU6YUgsc2hvdzpqfSk7ZnVuY3Rpb24gYWQoaSl7aT1hWihpKTtpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSk7cmV0dXJuIGl9dmFyIGFUPShmdW5jdGlvbigpe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLEY9dHJ1ZTtpLmlubmVySFRNTD0nPG9wdGlvbiB2YWx1ZT0idGVzdCI+dGVzdDwvb3B0aW9uPic7aWYoaS5vcHRpb25zJiZpLm9wdGlvbnNbMF0pe0Y9aS5vcHRpb25zWzBdLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkhPT0iT1BUSU9OIn1pPW51bGw7cmV0dXJuIEZ9KSgpO3ZhciBJPShmdW5jdGlvbigpe3RyeXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpO2lmKGkmJmkudEJvZGllcyl7aS5pbm5lckhUTUw9Ijx0Ym9keT48dHI+PHRkPnRlc3Q8L3RkPjwvdHI+PC90Ym9keT4iO3ZhciBicD10eXBlb2YgaS50Qm9kaWVzWzBdPT0idW5kZWZpbmVkIjtpPW51bGw7cmV0dXJuIGJwfX1jYXRjaChGKXtyZXR1cm4gdHJ1ZX19KSgpO3ZhciBhMj0oZnVuY3Rpb24oKXt0cnl7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aS5pbm5lckhUTUw9IjxsaW5rIC8+Ijt2YXIgYnA9KGkuY2hpbGROb2Rlcy5sZW5ndGg9PT0wKTtpPW51bGw7cmV0dXJuIGJwfWNhdGNoKEYpe3JldHVybiB0cnVlfX0pKCk7dmFyIHg9YVR8fEl8fGEyO3ZhciBhcT0oZnVuY3Rpb24oKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxicD1mYWxzZTt0cnl7aS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIikpO2JwPSFpLmZpcnN0Q2hpbGR8fGkuZmlyc3RDaGlsZCYmaS5maXJzdENoaWxkLm5vZGVUeXBlIT09M31jYXRjaChGKXticD10cnVlfWk9bnVsbDtyZXR1cm4gYnB9KSgpO2Z1bmN0aW9uIE8oYnIsYnQpe2JyPWFaKGJyKTt2YXIgYnU9YnIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxicT1idS5sZW5ndGg7d2hpbGUoYnEtLSl7WihidVticV0pfWlmKGJ0JiZidC50b0VsZW1lbnQpe2J0PWJ0LnRvRWxlbWVudCgpfWlmKE9iamVjdC5pc0VsZW1lbnQoYnQpKXtyZXR1cm4gYnIudXBkYXRlKCkuaW5zZXJ0KGJ0KX1idD1PYmplY3QudG9IVE1MKGJ0KTt2YXIgYnA9YnIudGFnTmFtZS50b1VwcGVyQ2FzZSgpO2lmKGJwPT09IlNDUklQVCImJmFxKXtici50ZXh0PWJ0O3JldHVybiBicn1pZih4KXtpZihicCBpbiBMLnRhZ3Mpe3doaWxlKGJyLmZpcnN0Q2hpbGQpe2JyLnJlbW92ZUNoaWxkKGJyLmZpcnN0Q2hpbGQpfXZhciBGPXQoYnAsYnQuc3RyaXBTY3JpcHRzKCkpO2Zvcih2YXIgYnE9MCxiczticz1GW2JxXTticSsrKXtici5hcHBlbmRDaGlsZChicyl9fWVsc2V7aWYoYTImJk9iamVjdC5pc1N0cmluZyhidCkmJmJ0LmluZGV4T2YoIjxsaW5rIik+LTEpe3doaWxlKGJyLmZpcnN0Q2hpbGQpe2JyLnJlbW92ZUNoaWxkKGJyLmZpcnN0Q2hpbGQpfXZhciBGPXQoYnAsYnQuc3RyaXBTY3JpcHRzKCksdHJ1ZSk7Zm9yKHZhciBicT0wLGJzO2JzPUZbYnFdO2JxKyspe2JyLmFwcGVuZENoaWxkKGJzKX19ZWxzZXtici5pbm5lckhUTUw9YnQuc3RyaXBTY3JpcHRzKCl9fX1lbHNle2JyLmlubmVySFRNTD1idC5zdHJpcFNjcmlwdHMoKX1idC5ldmFsU2NyaXB0cy5iaW5kKGJ0KS5kZWZlcigpO3JldHVybiBicn1mdW5jdGlvbiBhaChGLGJwKXtGPWFaKEYpO2lmKGJwJiZicC50b0VsZW1lbnQpe2JwPWJwLnRvRWxlbWVudCgpfWVsc2V7aWYoIU9iamVjdC5pc0VsZW1lbnQoYnApKXticD1PYmplY3QudG9IVE1MKGJwKTt2YXIgaT1GLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtpLnNlbGVjdE5vZGUoRik7YnAuZXZhbFNjcmlwdHMuYmluZChicCkuZGVmZXIoKTticD1pLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChicC5zdHJpcFNjcmlwdHMoKSl9fUYucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYnAsRik7cmV0dXJuIEZ9dmFyIEw9e2JlZm9yZTpmdW5jdGlvbihpLEYpe2kucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoRixpKX0sdG9wOmZ1bmN0aW9uKGksRil7aS5pbnNlcnRCZWZvcmUoRixpLmZpcnN0Q2hpbGQpfSxib3R0b206ZnVuY3Rpb24oaSxGKXtpLmFwcGVuZENoaWxkKEYpfSxhZnRlcjpmdW5jdGlvbihpLEYpe2kucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoRixpLm5leHRTaWJsaW5nKX0sdGFnczp7VEFCTEU6WyI8dGFibGU+IiwiPC90YWJsZT4iLDFdLFRCT0RZOlsiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+IiwyXSxUUjpbIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiIsM10sVEQ6WyI8dGFibGU+PHRib2R5Pjx0cj48dGQ+IiwiPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4iLDRdLFNFTEVDVDpbIjxzZWxlY3Q+IiwiPC9zZWxlY3Q+IiwxXX19O3ZhciBhSj1MLnRhZ3M7T2JqZWN0LmV4dGVuZChhSix7VEhFQUQ6YUouVEJPRFksVEZPT1Q6YUouVEJPRFksVEg6YUouVER9KTtmdW5jdGlvbiBhbyhicCxicyl7YnA9YVooYnApO2lmKGJzJiZicy50b0VsZW1lbnQpe2JzPWJzLnRvRWxlbWVudCgpfWlmKE9iamVjdC5pc0VsZW1lbnQoYnMpKXticC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChicyxicCk7cmV0dXJuIGJwfWJzPU9iamVjdC50b0hUTUwoYnMpO3ZhciBicj1icC5wYXJlbnROb2RlLEY9YnIudGFnTmFtZS50b1VwcGVyQ2FzZSgpO2lmKEYgaW4gTC50YWdzKXt2YXIgYnQ9YUYubmV4dChicCk7dmFyIGk9dChGLGJzLnN0cmlwU2NyaXB0cygpKTtici5yZW1vdmVDaGlsZChicCk7dmFyIGJxO2lmKGJ0KXticT1mdW5jdGlvbihidSl7YnIuaW5zZXJ0QmVmb3JlKGJ1LGJ0KX19ZWxzZXticT1mdW5jdGlvbihidSl7YnIuYXBwZW5kQ2hpbGQoYnUpfX1pLmVhY2goYnEpfWVsc2V7YnAub3V0ZXJIVE1MPWJzLnN0cmlwU2NyaXB0cygpfWJzLmV2YWxTY3JpcHRzLmJpbmQoYnMpLmRlZmVyKCk7cmV0dXJuIGJwfWlmKCJvdXRlckhUTUwiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCl7YWg9YW99ZnVuY3Rpb24gYTcoaSl7aWYoT2JqZWN0LmlzVW5kZWZpbmVkKGkpfHxpPT09bnVsbCl7cmV0dXJuIGZhbHNlfWlmKE9iamVjdC5pc1N0cmluZyhpKXx8T2JqZWN0LmlzTnVtYmVyKGkpKXtyZXR1cm4gdHJ1ZX1pZihPYmplY3QuaXNFbGVtZW50KGkpKXtyZXR1cm4gdHJ1ZX1pZihpLnRvRWxlbWVudHx8aS50b0hUTUwpe3JldHVybiB0cnVlfXJldHVybiBmYWxzZX1mdW5jdGlvbiBibihicixidCxGKXtGPUYudG9Mb3dlckNhc2UoKTt2YXIgYnY9TFtGXTtpZihidCYmYnQudG9FbGVtZW50KXtidD1idC50b0VsZW1lbnQoKX1pZihPYmplY3QuaXNFbGVtZW50KGJ0KSl7YnYoYnIsYnQpO3JldHVybiBicn1idD1PYmplY3QudG9IVE1MKGJ0KTt2YXIgYnE9KChGPT09ImJlZm9yZSJ8fEY9PT0iYWZ0ZXIiKT9ici5wYXJlbnROb2RlOmJyKS50YWdOYW1lLnRvVXBwZXJDYXNlKCk7dmFyIGJ1PXQoYnEsYnQuc3RyaXBTY3JpcHRzKCkpO2lmKEY9PT0idG9wInx8Rj09PSJhZnRlciIpe2J1LnJldmVyc2UoKX1mb3IodmFyIGJwPTAsYnM7YnM9YnVbYnBdO2JwKyspe2J2KGJyLGJzKX1idC5ldmFsU2NyaXB0cy5iaW5kKGJ0KS5kZWZlcigpfWZ1bmN0aW9uIFEoRixicCl7Rj1hWihGKTtpZihhNyhicCkpe2JwPXtib3R0b206YnB9fWZvcih2YXIgaSBpbiBicCl7Ym4oRixicFtpXSxpKX1yZXR1cm4gRn1mdW5jdGlvbiB1KEYsYnAsaSl7Rj1hWihGKTtpZihPYmplY3QuaXNFbGVtZW50KGJwKSl7YVooYnApLndyaXRlQXR0cmlidXRlKGl8fHt9KX1lbHNle2lmKE9iamVjdC5pc1N0cmluZyhicCkpe2JwPW5ldyBhRihicCxpKX1lbHNle2JwPW5ldyBhRigiZGl2IixicCl9fWlmKEYucGFyZW50Tm9kZSl7Ri5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChicCxGKX1icC5hcHBlbmRDaGlsZChGKTtyZXR1cm4gYnB9ZnVuY3Rpb24gdyhGKXtGPWFaKEYpO3ZhciBicD1GLmZpcnN0Q2hpbGQ7d2hpbGUoYnApe3ZhciBpPWJwLm5leHRTaWJsaW5nO2lmKGJwLm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREUmJiEvXFMvLnRlc3QoYnAubm9kZVZhbHVlKSl7Ri5yZW1vdmVDaGlsZChicCl9YnA9aX1yZXR1cm4gRn1mdW5jdGlvbiBhNChpKXtyZXR1cm4gYVooaSkuaW5uZXJIVE1MLmJsYW5rKCl9ZnVuY3Rpb24gdChicyxicixidCl7dmFyIGJxPUwudGFnc1tic10sYnU9YXY7dmFyIEY9ISFicTtpZighRiYmYnQpe0Y9dHJ1ZTticT1bIiIsIiIsMF19aWYoRil7YnUuaW5uZXJIVE1MPSImIzE2MDsiK2JxWzBdK2JyK2JxWzFdO2J1LnJlbW92ZUNoaWxkKGJ1LmZpcnN0Q2hpbGQpO2Zvcih2YXIgYnA9YnFbMl07YnAtLTspe2J1PWJ1LmZpcnN0Q2hpbGR9fWVsc2V7YnUuaW5uZXJIVE1MPWJyfXJldHVybiAkQShidS5jaGlsZE5vZGVzKX1mdW5jdGlvbiBFKGJxLEYpe2lmKCEoYnE9YVooYnEpKSl7cmV0dXJufXZhciBicz1icS5jbG9uZU5vZGUoRik7aWYoIWFZKXticy5fcHJvdG90eXBlVUlEPWFFO2lmKEYpe3ZhciBicj1hRi5zZWxlY3QoYnMsIioiKSxicD1ici5sZW5ndGg7d2hpbGUoYnAtLSl7YnJbYnBdLl9wcm90b3R5cGVVSUQ9YUV9fX1yZXR1cm4gYUYuZXh0ZW5kKGJzKX1mdW5jdGlvbiBaKEYpe3ZhciBpPU0oRik7aWYoaSl7YUYuc3RvcE9ic2VydmluZyhGKTtpZighYVkpe0YuX3Byb3RvdHlwZVVJRD1hRX1kZWxldGUgYUYuU3RvcmFnZVtpXX19ZnVuY3Rpb24gYmwoYnApe3ZhciBGPWJwLmxlbmd0aDt3aGlsZShGLS0pe1ooYnBbRl0pfX1mdW5jdGlvbiBhdChicil7dmFyIGJxPWJyLmxlbmd0aCxicCxGO3doaWxlKGJxLS0pe2JwPWJyW2JxXTtGPU0oYnApO2RlbGV0ZSBhRi5TdG9yYWdlW0ZdO2RlbGV0ZSBFdmVudC5jYWNoZVtGXX19aWYoYVkpe2JsPWF0fWZ1bmN0aW9uIG0oYnApe2lmKCEoYnA9YVooYnApKSl7cmV0dXJufVooYnApO3ZhciBicT1icC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLEY9YnEubGVuZ3RoO3doaWxlKEYtLSl7WihicVtGXSl9cmV0dXJuIG51bGx9T2JqZWN0LmV4dGVuZChhMyx7cmVtb3ZlOmFkLHVwZGF0ZTpPLHJlcGxhY2U6YWgsaW5zZXJ0OlEsd3JhcDp1LGNsZWFuV2hpdGVzcGFjZTp3LGVtcHR5OmE0LGNsb25lOkUscHVyZ2U6bX0pO2Z1bmN0aW9uIGFtKGksYnAsYnEpe2k9YVooaSk7YnE9YnF8fC0xO3ZhciBGPVtdO3doaWxlKGk9aVticF0pe2lmKGkubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7Ri5wdXNoKGFGLmV4dGVuZChpKSl9aWYoRi5sZW5ndGg9PT1icSl7YnJlYWt9fXJldHVybiBGfWZ1bmN0aW9uIGFMKGkpe3JldHVybiBhbShpLCJwYXJlbnROb2RlIil9ZnVuY3Rpb24gYm0oaSl7cmV0dXJuIGFGLnNlbGVjdChpLCIqIil9ZnVuY3Rpb24gWChpKXtpPWFaKGkpLmZpcnN0Q2hpbGQ7d2hpbGUoaSYmaS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFKXtpPWkubmV4dFNpYmxpbmd9cmV0dXJuIGFaKGkpfWZ1bmN0aW9uIGJpKEYpe3ZhciBpPVtdLGJwPWFaKEYpLmZpcnN0Q2hpbGQ7d2hpbGUoYnApe2lmKGJwLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe2kucHVzaChhRi5leHRlbmQoYnApKX1icD1icC5uZXh0U2libGluZ31yZXR1cm4gaX1mdW5jdGlvbiBwKGkpe3JldHVybiBhbShpLCJwcmV2aW91c1NpYmxpbmciKX1mdW5jdGlvbiBiaChpKXtyZXR1cm4gYW0oaSwibmV4dFNpYmxpbmciKX1mdW5jdGlvbiBhVihpKXtpPWFaKGkpO3ZhciBicD1wKGkpLEY9YmgoaSk7cmV0dXJuIGJwLnJldmVyc2UoKS5jb25jYXQoRil9ZnVuY3Rpb24gYVIoRixpKXtGPWFaKEYpO2lmKE9iamVjdC5pc1N0cmluZyhpKSl7cmV0dXJuIFByb3RvdHlwZS5TZWxlY3Rvci5tYXRjaChGLGkpfXJldHVybiBpLm1hdGNoKEYpfWZ1bmN0aW9uIGFXKEYsYnAsYnEsaSl7Rj1hWihGKSxicT1icXx8MCxpPWl8fDA7aWYoT2JqZWN0LmlzTnVtYmVyKGJxKSl7aT1icSxicT1udWxsfXdoaWxlKEY9RlticF0pe2lmKEYubm9kZVR5cGUhPT0xKXtjb250aW51ZX1pZihicSYmIVByb3RvdHlwZS5TZWxlY3Rvci5tYXRjaChGLGJxKSl7Y29udGludWV9aWYoLS1pPj0wKXtjb250aW51ZX1yZXR1cm4gYUYuZXh0ZW5kKEYpfX1mdW5jdGlvbiBhYShGLGJwLGkpe0Y9YVooRik7aWYoYXJndW1lbnRzLmxlbmd0aD09PTEpe3JldHVybiBhWihGLnBhcmVudE5vZGUpfXJldHVybiBhVyhGLCJwYXJlbnROb2RlIixicCxpKX1mdW5jdGlvbiB5KEYsYnEsaSl7aWYoYXJndW1lbnRzLmxlbmd0aD09PTEpe3JldHVybiBYKEYpfUY9YVooRiksYnE9YnF8fDAsaT1pfHwwO2lmKE9iamVjdC5pc051bWJlcihicSkpe2k9YnEsYnE9IioifXZhciBicD1Qcm90b3R5cGUuU2VsZWN0b3Iuc2VsZWN0KGJxLEYpW2ldO3JldHVybiBhRi5leHRlbmQoYnApfWZ1bmN0aW9uIGgoRixicCxpKXtyZXR1cm4gYVcoRiwicHJldmlvdXNTaWJsaW5nIixicCxpKX1mdW5jdGlvbiBhQihGLGJwLGkpe3JldHVybiBhVyhGLCJuZXh0U2libGluZyIsYnAsaSl9ZnVuY3Rpb24gYmIoaSl7aT1hWihpKTt2YXIgRj1hMS5jYWxsKGFyZ3VtZW50cywxKS5qb2luKCIsICIpO3JldHVybiBQcm90b3R5cGUuU2VsZWN0b3Iuc2VsZWN0KEYsaSl9ZnVuY3Rpb24gYUQoYnEpe2JxPWFaKGJxKTt2YXIgYnM9YTEuY2FsbChhcmd1bWVudHMsMSkuam9pbigiLCAiKTt2YXIgYnQ9YUYuc2libGluZ3MoYnEpLGJwPVtdO2Zvcih2YXIgRj0wLGJyO2JyPWJ0W0ZdO0YrKyl7aWYoUHJvdG90eXBlLlNlbGVjdG9yLm1hdGNoKGJyLGJzKSl7YnAucHVzaChicil9fXJldHVybiBicH1mdW5jdGlvbiBEKEYsaSl7Rj1hWihGKSxpPWFaKGkpO2lmKCFGfHwhaSl7cmV0dXJuIGZhbHNlfXdoaWxlKEY9Ri5wYXJlbnROb2RlKXtpZihGPT09aSl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX1mdW5jdGlvbiBCKEYsaSl7Rj1hWihGKSxpPWFaKGkpO2lmKCFGfHwhaSl7cmV0dXJuIGZhbHNlfWlmKCFpLmNvbnRhaW5zKXtyZXR1cm4gRChGLGkpfXJldHVybiBpLmNvbnRhaW5zKEYpJiZpIT09Rn1mdW5jdGlvbiBKKEYsaSl7Rj1hWihGKSxpPWFaKGkpO2lmKCFGfHwhaSl7cmV0dXJuIGZhbHNlfXJldHVybihGLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGkpJjgpPT09OH12YXIgYU07aWYoYXYuY29tcGFyZURvY3VtZW50UG9zaXRpb24pe2FNPUp9ZWxzZXtpZihhdi5jb250YWlucyl7YU09Qn1lbHNle2FNPUR9fU9iamVjdC5leHRlbmQoYTMse3JlY3Vyc2l2ZWx5Q29sbGVjdDphbSxhbmNlc3RvcnM6YUwsZGVzY2VuZGFudHM6Ym0sZmlyc3REZXNjZW5kYW50OlgsaW1tZWRpYXRlRGVzY2VuZGFudHM6YmkscHJldmlvdXNTaWJsaW5nczpwLG5leHRTaWJsaW5nczpiaCxzaWJsaW5nczphVixtYXRjaDphUix1cDphYSxkb3duOnkscHJldmlvdXM6aCxuZXh0OmFCLHNlbGVjdDpiYixhZGphY2VudDphRCxkZXNjZW5kYW50T2Y6YU0sZ2V0RWxlbWVudHNCeVNlbGVjdG9yOmJiLGNoaWxkRWxlbWVudHM6Yml9KTt2YXIgVD0xO2Z1bmN0aW9uIGFVKGkpe2k9YVooaSk7dmFyIEY9YUYucmVhZEF0dHJpYnV0ZShpLCJpZCIpO2lmKEYpe3JldHVybiBGfWRve0Y9ImFub255bW91c19lbGVtZW50XyIrVCsrfXdoaWxlKGFaKEYpKTthRi53cml0ZUF0dHJpYnV0ZShpLCJpZCIsRik7cmV0dXJuIEZ9ZnVuY3Rpb24gYTkoRixpKXtyZXR1cm4gYVooRikuZ2V0QXR0cmlidXRlKGkpfWZ1bmN0aW9uIEsoRixpKXtGPWFaKEYpO3ZhciBicD1hRy5yZWFkO2lmKGJwLnZhbHVlc1tpXSl7cmV0dXJuIGJwLnZhbHVlc1tpXShGLGkpfWlmKGJwLm5hbWVzW2ldKXtpPWJwLm5hbWVzW2ldfWlmKGkuaW5jbHVkZSgiOiIpKXtpZighRi5hdHRyaWJ1dGVzfHwhRi5hdHRyaWJ1dGVzW2ldKXtyZXR1cm4gbnVsbH1yZXR1cm4gRi5hdHRyaWJ1dGVzW2ldLnZhbHVlfXJldHVybiBGLmdldEF0dHJpYnV0ZShpKX1mdW5jdGlvbiBlKEYsaSl7aWYoaT09PSJ0aXRsZSIpe3JldHVybiBGLnRpdGxlfXJldHVybiBGLmdldEF0dHJpYnV0ZShpKX12YXIgVT0oZnVuY3Rpb24oKXthdi5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLFtdKTt2YXIgaT1hdi5nZXRBdHRyaWJ1dGUoIm9uY2xpY2siKTt2YXIgRj1PYmplY3QuaXNBcnJheShpKTthdi5yZW1vdmVBdHRyaWJ1dGUoIm9uY2xpY2siKTtyZXR1cm4gRn0pKCk7aWYoVSl7YTk9S31lbHNle2lmKFByb3RvdHlwZS5Ccm93c2VyLk9wZXJhKXthOT1lfX1mdW5jdGlvbiBhMChicSxicCxicyl7YnE9YVooYnEpO3ZhciBGPXt9LGJyPWFHLndyaXRlO2lmKHR5cGVvZiBicD09PSJvYmplY3QiKXtGPWJwfWVsc2V7RlticF09T2JqZWN0LmlzVW5kZWZpbmVkKGJzKT90cnVlOmJzfWZvcih2YXIgaSBpbiBGKXticD1ici5uYW1lc1tpXXx8aTticz1GW2ldO2lmKGJyLnZhbHVlc1tpXSl7YnM9YnIudmFsdWVzW2ldKGJxLGJzKTtpZihPYmplY3QuaXNVbmRlZmluZWQoYnMpKXtjb250aW51ZX19aWYoYnM9PT1mYWxzZXx8YnM9PT1udWxsKXticS5yZW1vdmVBdHRyaWJ1dGUoYnApfWVsc2V7aWYoYnM9PT10cnVlKXticS5zZXRBdHRyaWJ1dGUoYnAsYnApfWVsc2V7YnEuc2V0QXR0cmlidXRlKGJwLGJzKX19fXJldHVybiBicX12YXIgYT0oZnVuY3Rpb24oKXtpZighZCl7cmV0dXJuIGZhbHNlfXZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJzxpbnB1dCB0eXBlPSJjaGVja2JveCI+Jyk7Ri5jaGVja2VkPXRydWU7dmFyIGk9Ri5nZXRBdHRyaWJ1dGVOb2RlKCJjaGVja2VkIik7cmV0dXJuICFpfHwhaS5zcGVjaWZpZWR9KSgpO2Z1bmN0aW9uIFkoaSxicCl7YnA9YUcuaGFzW2JwXXx8YnA7dmFyIEY9YVooaSkuZ2V0QXR0cmlidXRlTm9kZShicCk7cmV0dXJuICEhKEYmJkYuc3BlY2lmaWVkKX1mdW5jdGlvbiBiZyhpLEYpe2lmKEY9PT0iY2hlY2tlZCIpe3JldHVybiBpLmNoZWNrZWR9cmV0dXJuIFkoaSxGKX1hOC5FbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkLmhhc0F0dHJpYnV0ZT1hP2JnOlk7ZnVuY3Rpb24gayhpKXtyZXR1cm4gbmV3IGFGLkNsYXNzTmFtZXMoaSl9dmFyIFY9e307ZnVuY3Rpb24gZihGKXtpZihWW0ZdKXtyZXR1cm4gVltGXX12YXIgaT1uZXcgUmVnRXhwKCIoXnxcXHMrKSIrRisiKFxccyt8JCkiKTtWW0ZdPWk7cmV0dXJuIGl9ZnVuY3Rpb24gYWwoaSxGKXtpZighKGk9YVooaSkpKXtyZXR1cm59dmFyIGJwPWkuY2xhc3NOYW1lO2lmKGJwLmxlbmd0aD09PTApe3JldHVybiBmYWxzZX1pZihicD09PUYpe3JldHVybiB0cnVlfXJldHVybiBmKEYpLnRlc3QoYnApfWZ1bmN0aW9uIG8oaSxGKXtpZighKGk9YVooaSkpKXtyZXR1cm59aWYoIWFsKGksRikpe2kuY2xhc3NOYW1lKz0oaS5jbGFzc05hbWU/IiAiOiIiKStGfXJldHVybiBpfWZ1bmN0aW9uIGF1KGksRil7aWYoIShpPWFaKGkpKSl7cmV0dXJufWkuY2xhc3NOYW1lPWkuY2xhc3NOYW1lLnJlcGxhY2UoZihGKSwiICIpLnN0cmlwKCk7cmV0dXJuIGl9ZnVuY3Rpb24gYWUoRixicCxpKXtpZighKEY9YVooRikpKXtyZXR1cm59aWYoT2JqZWN0LmlzVW5kZWZpbmVkKGkpKXtpPSFhbChGLGJwKX12YXIgYnE9YUZbaT8iYWRkQ2xhc3NOYW1lIjoicmVtb3ZlQ2xhc3NOYW1lIl07cmV0dXJuIGJxKEYsYnApfXZhciBhRz17fTt2YXIgYVA9ImNsYXNzTmFtZSIsYXI9ImZvciI7YXYuc2V0QXR0cmlidXRlKGFQLCJ4Iik7aWYoYXYuY2xhc3NOYW1lIT09IngiKXthdi5zZXRBdHRyaWJ1dGUoImNsYXNzIiwieCIpO2lmKGF2LmNsYXNzTmFtZT09PSJ4Iil7YVA9ImNsYXNzIn19dmFyIGFLPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIik7YUsuc2V0QXR0cmlidXRlKGFyLCJ4Iik7aWYoYUsuaHRtbEZvciE9PSJ4Iil7YUsuc2V0QXR0cmlidXRlKCJodG1sRm9yIiwieCIpO2lmKGFLLmh0bWxGb3I9PT0ieCIpe2FyPSJodG1sRm9yIn19YUs9bnVsbDtmdW5jdGlvbiBhYyhpLEYpe3JldHVybiBpLmdldEF0dHJpYnV0ZShGKX1mdW5jdGlvbiBnKGksRil7cmV0dXJuIGkuZ2V0QXR0cmlidXRlKEYsMil9ZnVuY3Rpb24gQShpLGJwKXt2YXIgRj1pLmdldEF0dHJpYnV0ZU5vZGUoYnApO3JldHVybiBGP0YudmFsdWU6IiJ9ZnVuY3Rpb24gYmooaSxGKXtyZXR1cm4gYVooaSkuaGFzQXR0cmlidXRlKEYpP0Y6bnVsbH1hdi5vbmNsaWNrPVByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uO3ZhciBQPWF2LmdldEF0dHJpYnV0ZSgib25jbGljayIpO3ZhciBhdztpZihTdHJpbmcoUCkuaW5kZXhPZigieyIpPi0xKXthdz1mdW5jdGlvbihpLEYpe3ZhciBicD1pLmdldEF0dHJpYnV0ZShGKTtpZighYnApe3JldHVybiBudWxsfWJwPWJwLnRvU3RyaW5nKCk7YnA9YnAuc3BsaXQoInsiKVsxXTticD1icC5zcGxpdCgifSIpWzBdO3JldHVybiBicC5zdHJpcCgpfX1lbHNle2lmKFA9PT0iIil7YXc9ZnVuY3Rpb24oaSxGKXt2YXIgYnA9aS5nZXRBdHRyaWJ1dGUoRik7aWYoIWJwKXtyZXR1cm4gbnVsbH1yZXR1cm4gYnAuc3RyaXAoKX19fWFHLnJlYWQ9e25hbWVzOnsiY2xhc3MiOmFQLGNsYXNzTmFtZTphUCwiZm9yIjphcixodG1sRm9yOmFyfSx2YWx1ZXM6e3N0eWxlOmZ1bmN0aW9uKGkpe3JldHVybiBpLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKX0sdGl0bGU6ZnVuY3Rpb24oaSl7cmV0dXJuIGkudGl0bGV9fX07YUcud3JpdGU9e25hbWVzOntjbGFzc05hbWU6ImNsYXNzIixodG1sRm9yOiJmb3IiLGNlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIn0sdmFsdWVzOntjaGVja2VkOmZ1bmN0aW9uKGksRil7Rj0hIUY7aS5jaGVja2VkPUY7cmV0dXJuIEY/ImNoZWNrZWQiOm51bGx9LHN0eWxlOmZ1bmN0aW9uKGksRil7aS5zdHlsZS5jc3NUZXh0PUY/RjoiIn19fTthRy5oYXM9e25hbWVzOnt9fTtPYmplY3QuZXh0ZW5kKGFHLndyaXRlLm5hbWVzLGFHLnJlYWQubmFtZXMpO3ZhciBhNj0kdygiY29sU3BhbiByb3dTcGFuIHZBbGlnbiBkYXRlVGltZSBhY2Nlc3NLZXkgdGFiSW5kZXggZW5jVHlwZSBtYXhMZW5ndGggcmVhZE9ubHkgbG9uZ0Rlc2MgZnJhbWVCb3JkZXIiKTtmb3IodmFyIGFmPTAsYWc7YWc9YTZbYWZdO2FmKyspe2FHLndyaXRlLm5hbWVzW2FnLnRvTG93ZXJDYXNlKCldPWFnO2FHLmhhcy5uYW1lc1thZy50b0xvd2VyQ2FzZSgpXT1hZ31PYmplY3QuZXh0ZW5kKGFHLnJlYWQudmFsdWVzLHtocmVmOmcsc3JjOmcsdHlwZTphYyxhY3Rpb246QSxkaXNhYmxlZDpiaixjaGVja2VkOmJqLHJlYWRvbmx5OmJqLG11bHRpcGxlOmJqLG9ubG9hZDphdyxvbnVubG9hZDphdyxvbmNsaWNrOmF3LG9uZGJsY2xpY2s6YXcsb25tb3VzZWRvd246YXcsb25tb3VzZXVwOmF3LG9ubW91c2VvdmVyOmF3LG9ubW91c2Vtb3ZlOmF3LG9ubW91c2VvdXQ6YXcsb25mb2N1czphdyxvbmJsdXI6YXcsb25rZXlwcmVzczphdyxvbmtleWRvd246YXcsb25rZXl1cDphdyxvbnN1Ym1pdDphdyxvbnJlc2V0OmF3LG9uc2VsZWN0OmF3LG9uY2hhbmdlOmF3fSk7T2JqZWN0LmV4dGVuZChhMyx7aWRlbnRpZnk6YVUscmVhZEF0dHJpYnV0ZTphOSx3cml0ZUF0dHJpYnV0ZTphMCxjbGFzc05hbWVzOmssaGFzQ2xhc3NOYW1lOmFsLGFkZENsYXNzTmFtZTpvLHJlbW92ZUNsYXNzTmFtZTphdSx0b2dnbGVDbGFzc05hbWU6YWV9KTtmdW5jdGlvbiBXKGkpe2lmKGk9PT0iZmxvYXQifHxpPT09InN0eWxlRmxvYXQiKXtyZXR1cm4iY3NzRmxvYXQifXJldHVybiBpLmNhbWVsaXplKCl9ZnVuY3Rpb24gYm8oaSl7aWYoaT09PSJmbG9hdCJ8fGk9PT0iY3NzRmxvYXQiKXtyZXR1cm4ic3R5bGVGbG9hdCJ9cmV0dXJuIGkuY2FtZWxpemUoKX1mdW5jdGlvbiBDKGJwLGJxKXticD1hWihicCk7dmFyIGJ0PWJwLnN0eWxlLEY7aWYoT2JqZWN0LmlzU3RyaW5nKGJxKSl7YnQuY3NzVGV4dCs9IjsiK2JxO2lmKGJxLmluY2x1ZGUoIm9wYWNpdHkiKSl7dmFyIGk9YnEubWF0Y2goL29wYWNpdHk6XHMqKFxkP1wuP1xkKikvKVsxXTthRi5zZXRPcGFjaXR5KGJwLGkpfXJldHVybiBicH1mb3IodmFyIGJzIGluIGJxKXtpZihicz09PSJvcGFjaXR5Iil7YUYuc2V0T3BhY2l0eShicCxicVtic10pfWVsc2V7dmFyIGJyPWJxW2JzXTtpZihicz09PSJmbG9hdCJ8fGJzPT09ImNzc0Zsb2F0Iil7YnM9T2JqZWN0LmlzVW5kZWZpbmVkKGJ0LnN0eWxlRmxvYXQpPyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifWJ0W2JzXT1icn19cmV0dXJuIGJwfWZ1bmN0aW9uIGFPKEYsYnApe0Y9YVooRik7YnA9VyhicCk7dmFyIGJxPUYuc3R5bGVbYnBdO2lmKCFicXx8YnE9PT0iYXV0byIpe3ZhciBpPWRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoRixudWxsKTticT1pP2lbYnBdOm51bGx9aWYoYnA9PT0ib3BhY2l0eSIpe3JldHVybiBicT9wYXJzZUZsb2F0KGJxKToxfXJldHVybiBicT09PSJhdXRvIj9udWxsOmJxfWZ1bmN0aW9uIHMoaSxGKXtzd2l0Y2goRil7Y2FzZSJoZWlnaHQiOmNhc2Uid2lkdGgiOmlmKCFhRi52aXNpYmxlKGkpKXtyZXR1cm4gbnVsbH12YXIgYnA9cGFyc2VJbnQoYU8oaSxGKSwxMCk7aWYoYnAhPT1pWyJvZmZzZXQiK0YuY2FwaXRhbGl6ZSgpXSl7cmV0dXJuIGJwKyJweCJ9cmV0dXJuIGFGLm1lYXN1cmUoaSxGKTtkZWZhdWx0OnJldHVybiBhTyhpLEYpfX1mdW5jdGlvbiBhaihpLEYpe2k9YVooaSk7Rj1ibyhGKTt2YXIgYnA9aS5zdHlsZVtGXTtpZighYnAmJmkuY3VycmVudFN0eWxlKXticD1pLmN1cnJlbnRTdHlsZVtGXX1pZihGPT09Im9wYWNpdHkiKXtpZighTil7cmV0dXJuIGJlKGkpfWVsc2V7cmV0dXJuIGJwP3BhcnNlRmxvYXQoYnApOjF9fWlmKGJwPT09ImF1dG8iKXtpZigoRj09PSJ3aWR0aCJ8fEY9PT0iaGVpZ2h0IikmJmFGLnZpc2libGUoaSkpe3JldHVybiBhRi5tZWFzdXJlKGksRikrInB4In1yZXR1cm4gbnVsbH1yZXR1cm4gYnB9ZnVuY3Rpb24gYUEoaSl7cmV0dXJuKGl8fCIiKS5yZXBsYWNlKC9hbHBoYVwoW15cKV0qXCkvZ2ksIiIpfWZ1bmN0aW9uIGFiKGkpe2lmKCFpLmN1cnJlbnRTdHlsZXx8IWkuY3VycmVudFN0eWxlLmhhc0xheW91dCl7aS5zdHlsZS56b29tPTF9cmV0dXJuIGl9dmFyIE49KGZ1bmN0aW9uKCl7YXYuc3R5bGUuY3NzVGV4dD0ib3BhY2l0eTouNTUiO3JldHVybi9eMC41NS8udGVzdChhdi5zdHlsZS5vcGFjaXR5KX0pKCk7ZnVuY3Rpb24geihpLEYpe2k9YVooaSk7aWYoRj09MXx8Rj09PSIiKXtGPSIifWVsc2V7aWYoRjwwLjAwMDAxKXtGPTB9fWkuc3R5bGUub3BhY2l0eT1GO3JldHVybiBpfWZ1bmN0aW9uIGJmKGksYnEpe2lmKE4pe3JldHVybiB6KGksYnEpfWk9YWIoYVooaSkpO3ZhciBicD1hRi5nZXRTdHlsZShpLCJmaWx0ZXIiKSxGPWkuc3R5bGU7aWYoYnE9PTF8fGJxPT09IiIpe2JwPWFBKGJwKTtpZihicCl7Ri5maWx0ZXI9YnB9ZWxzZXtGLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIil9cmV0dXJuIGl9aWYoYnE8MC4wMDAwMSl7YnE9MH1GLmZpbHRlcj1hQShicCkrIiBhbHBoYShvcGFjaXR5PSIrKGJxKjEwMCkrIikiO3JldHVybiBpfWZ1bmN0aW9uIGJkKGkpe3JldHVybiBhRi5nZXRTdHlsZShpLCJvcGFjaXR5Iil9ZnVuY3Rpb24gYmUoRil7aWYoTil7cmV0dXJuIGJkKEYpfXZhciBicD1hRi5nZXRTdHlsZShGLCJmaWx0ZXIiKTtpZihicC5sZW5ndGg9PT0wKXtyZXR1cm4gMX12YXIgaT0oYnB8fCIiKS5tYXRjaCgvYWxwaGFcKG9wYWNpdHk9KC4qKVwpL2kpO2lmKGkmJmlbMV0pe3JldHVybiBwYXJzZUZsb2F0KGlbMV0pLzEwMH1yZXR1cm4gMX1PYmplY3QuZXh0ZW5kKGEzLHtzZXRTdHlsZTpDLGdldFN0eWxlOmFPLHNldE9wYWNpdHk6eixnZXRPcGFjaXR5OmJkfSk7aWYoInN0eWxlRmxvYXQiIGluIGF2LnN0eWxlKXthMy5nZXRTdHlsZT1hajthMy5zZXRPcGFjaXR5PWJmO2EzLmdldE9wYWNpdHk9YmV9dmFyIGw9MDthOC5FbGVtZW50LlN0b3JhZ2U9e1VJRDoxfTtmdW5jdGlvbiBNKGkpe2lmKGk9PT13aW5kb3cpe3JldHVybiAwfWlmKHR5cGVvZiBpLl9wcm90b3R5cGVVSUQ9PT0idW5kZWZpbmVkIil7aS5fcHJvdG90eXBlVUlEPWFGLlN0b3JhZ2UuVUlEKyt9cmV0dXJuIGkuX3Byb3RvdHlwZVVJRH1mdW5jdGlvbiBjKGkpe2lmKGk9PT13aW5kb3cpe3JldHVybiAwfWlmKGk9PWRvY3VtZW50KXtyZXR1cm4gMX1yZXR1cm4gaS51bmlxdWVJRH12YXIgYVk9KCJ1bmlxdWVJRCIgaW4gYXYpO2lmKGFZKXtNPWN9ZnVuY3Rpb24gYihGKXtpZighKEY9YVooRikpKXtyZXR1cm59dmFyIGk9TShGKTtpZighYUYuU3RvcmFnZVtpXSl7YUYuU3RvcmFnZVtpXT0kSCgpfXJldHVybiBhRi5TdG9yYWdlW2ldfWZ1bmN0aW9uIGE1KEYsaSxicCl7aWYoIShGPWFaKEYpKSl7cmV0dXJufXZhciBicT1iKEYpO2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yKXticS51cGRhdGUoaSl9ZWxzZXticS5zZXQoaSxicCl9cmV0dXJuIEZ9ZnVuY3Rpb24gYU4oYnAsRixpKXtpZighKGJwPWFaKGJwKSkpe3JldHVybn12YXIgYnI9YihicCksYnE9YnIuZ2V0KEYpO2lmKE9iamVjdC5pc1VuZGVmaW5lZChicSkpe2JyLnNldChGLGkpO2JxPWl9cmV0dXJuIGJxfU9iamVjdC5leHRlbmQoYTMse2dldFN0b3JhZ2U6YixzdG9yZTphNSxyZXRyaWV2ZTphTn0pO3ZhciBhbj17fSxhWD1hRi5NZXRob2RzLkJ5VGFnLGFDPVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXM7aWYoIWFDLkVsZW1lbnRFeHRlbnNpb25zJiYoIl9fcHJvdG9fXyIgaW4gYXYpKXthOC5IVE1MRWxlbWVudD17fTthOC5IVE1MRWxlbWVudC5wcm90b3R5cGU9YXYuX19wcm90b19fO2FDLkVsZW1lbnRFeHRlbnNpb25zPXRydWV9ZnVuY3Rpb24gYmMoaSl7aWYodHlwZW9mIHdpbmRvdy5FbGVtZW50PT09InVuZGVmaW5lZCIpe3JldHVybiBmYWxzZX1pZighZCl7cmV0dXJuIGZhbHNlfXZhciBicD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGU7aWYoYnApe3ZhciBicj0iXyIrKE1hdGgucmFuZG9tKCkrIiIpLnNsaWNlKDIpLEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpKTticFticl09IngiO3ZhciBicT0oRlticl0hPT0ieCIpO2RlbGV0ZSBicFticl07Rj1udWxsO3JldHVybiBicX1yZXR1cm4gZmFsc2V9dmFyIGFwPWJjKCJvYmplY3QiKTtmdW5jdGlvbiBhayhGLGkpe2Zvcih2YXIgYnEgaW4gaSl7dmFyIGJwPWlbYnFdO2lmKE9iamVjdC5pc0Z1bmN0aW9uKGJwKSYmIShicSBpbiBGKSl7RlticV09YnAubWV0aG9kaXplKCl9fX12YXIgYms9e307ZnVuY3Rpb24gYXkoRil7dmFyIGk9TShGKTtyZXR1cm4oaSBpbiBiayl9ZnVuY3Rpb24gYXooYnApe2lmKCFicHx8YXkoYnApKXtyZXR1cm4gYnB9aWYoYnAubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERXx8YnA9PXdpbmRvdyl7cmV0dXJuIGJwfXZhciBpPU9iamVjdC5jbG9uZShhbiksRj1icC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7aWYoYVhbRl0pe09iamVjdC5leHRlbmQoaSxhWFtGXSl9YWsoYnAsaSk7YmtbTShicCldPXRydWU7cmV0dXJuIGJwfWZ1bmN0aW9uIGFTKEYpe2lmKCFGfHxheShGKSl7cmV0dXJuIEZ9dmFyIGk9Ri50YWdOYW1lO2lmKGkmJigvXig/Om9iamVjdHxhcHBsZXR8ZW1iZWQpJC9pLnRlc3QoaSkpKXthayhGLGFGLk1ldGhvZHMpO2FrKEYsYUYuTWV0aG9kcy5TaW11bGF0ZWQpO2FrKEYsYUYuTWV0aG9kcy5CeVRhZ1tpLnRvVXBwZXJDYXNlKCldKX1yZXR1cm4gRn1pZihhQy5TcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zKXthej1hcD9hUzpQcm90b3R5cGUuS31mdW5jdGlvbiBTKEYsaSl7Rj1GLnRvVXBwZXJDYXNlKCk7aWYoIWFYW0ZdKXthWFtGXT17fX1PYmplY3QuZXh0ZW5kKGFYW0ZdLGkpfWZ1bmN0aW9uIHEoRixicCxpKXtpZihPYmplY3QuaXNVbmRlZmluZWQoaSkpe2k9ZmFsc2V9Zm9yKHZhciBiciBpbiBicCl7dmFyIGJxPWJwW2JyXTtpZighT2JqZWN0LmlzRnVuY3Rpb24oYnEpKXtjb250aW51ZX1pZighaXx8IShiciBpbiBGKSl7Rlticl09YnEubWV0aG9kaXplKCl9fX1mdW5jdGlvbiBhaShicSl7dmFyIGk7dmFyIGJwPXtPUFRHUk9VUDoiT3B0R3JvdXAiLFRFWFRBUkVBOiJUZXh0QXJlYSIsUDoiUGFyYWdyYXBoIixGSUVMRFNFVDoiRmllbGRTZXQiLFVMOiJVTGlzdCIsT0w6Ik9MaXN0IixETDoiRExpc3QiLERJUjoiRGlyZWN0b3J5IixIMToiSGVhZGluZyIsSDI6IkhlYWRpbmciLEgzOiJIZWFkaW5nIixINDoiSGVhZGluZyIsSDU6IkhlYWRpbmciLEg2OiJIZWFkaW5nIixROiJRdW90ZSIsSU5TOiJNb2QiLERFTDoiTW9kIixBOiJBbmNob3IiLElNRzoiSW1hZ2UiLENBUFRJT046IlRhYmxlQ2FwdGlvbiIsQ09MOiJUYWJsZUNvbCIsQ09MR1JPVVA6IlRhYmxlQ29sIixUSEVBRDoiVGFibGVTZWN0aW9uIixURk9PVDoiVGFibGVTZWN0aW9uIixUQk9EWToiVGFibGVTZWN0aW9uIixUUjoiVGFibGVSb3ciLFRIOiJUYWJsZUNlbGwiLFREOiJUYWJsZUNlbGwiLEZSQU1FU0VUOiJGcmFtZVNldCIsSUZSQU1FOiJJRnJhbWUifTtpZihicFticV0pe2k9IkhUTUwiK2JwW2JxXSsiRWxlbWVudCJ9aWYod2luZG93W2ldKXtyZXR1cm4gd2luZG93W2ldfWk9IkhUTUwiK2JxKyJFbGVtZW50IjtpZih3aW5kb3dbaV0pe3JldHVybiB3aW5kb3dbaV19aT0iSFRNTCIrYnEuY2FwaXRhbGl6ZSgpKyJFbGVtZW50IjtpZih3aW5kb3dbaV0pe3JldHVybiB3aW5kb3dbaV19dmFyIEY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChicSksYnI9Ri5fX3Byb3RvX198fEYuY29uc3RydWN0b3IucHJvdG90eXBlO0Y9bnVsbDtyZXR1cm4gYnJ9ZnVuY3Rpb24gUihicil7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe0coKX1pZihhcmd1bWVudHMubGVuZ3RoPT09Mil7dmFyIGJ0PWJyO2JyPWFyZ3VtZW50c1sxXX1pZighYnQpe09iamVjdC5leHRlbmQoYUYuTWV0aG9kcyxicnx8e30pfWVsc2V7aWYoT2JqZWN0LmlzQXJyYXkoYnQpKXtmb3IodmFyIGJzPTAsYnE7YnE9YnRbYnNdO2JzKyspe1MoYnEsYnIpfX1lbHNle1MoYnQsYnIpfX12YXIgYnA9d2luZG93LkhUTUxFbGVtZW50P0hUTUxFbGVtZW50LnByb3RvdHlwZTphRi5wcm90b3R5cGU7aWYoYUMuRWxlbWVudEV4dGVuc2lvbnMpe3EoYnAsYUYuTWV0aG9kcyk7cShicCxhRi5NZXRob2RzLlNpbXVsYXRlZCx0cnVlKX1pZihhQy5TcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zKXtmb3IodmFyIGJxIGluIGFGLk1ldGhvZHMuQnlUYWcpe3ZhciBGPWFpKGJxKTtpZihPYmplY3QuaXNVbmRlZmluZWQoRikpe2NvbnRpbnVlfXEoRi5wcm90b3R5cGUsYVhbYnFdKX19T2JqZWN0LmV4dGVuZChhRixhRi5NZXRob2RzKTtPYmplY3QuZXh0ZW5kKGFGLGFGLk1ldGhvZHMuU2ltdWxhdGVkKTtkZWxldGUgYUYuQnlUYWc7ZGVsZXRlIGFGLlNpbXVsYXRlZDthRi5leHRlbmQucmVmcmVzaCgpO3I9e319T2JqZWN0LmV4dGVuZChhOC5FbGVtZW50LHtleHRlbmQ6YXosYWRkTWV0aG9kczpSfSk7aWYoYXo9PT1Qcm90b3R5cGUuSyl7YTguRWxlbWVudC5leHRlbmQucmVmcmVzaD1Qcm90b3R5cGUuZW1wdHlGdW5jdGlvbn1lbHNle2E4LkVsZW1lbnQuZXh0ZW5kLnJlZnJlc2g9ZnVuY3Rpb24oKXtpZihQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLkVsZW1lbnRFeHRlbnNpb25zKXtyZXR1cm59T2JqZWN0LmV4dGVuZChhbixhRi5NZXRob2RzKTtPYmplY3QuZXh0ZW5kKGFuLGFGLk1ldGhvZHMuU2ltdWxhdGVkKTtiaz17fX19ZnVuY3Rpb24gRygpe09iamVjdC5leHRlbmQoRm9ybSxGb3JtLk1ldGhvZHMpO09iamVjdC5leHRlbmQoRm9ybS5FbGVtZW50LEZvcm0uRWxlbWVudC5NZXRob2RzKTtPYmplY3QuZXh0ZW5kKGFGLk1ldGhvZHMuQnlUYWcse0ZPUk06T2JqZWN0LmNsb25lKEZvcm0uTWV0aG9kcyksSU5QVVQ6T2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKSxTRUxFQ1Q6T2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKSxURVhUQVJFQTpPYmplY3QuY2xvbmUoRm9ybS5FbGVtZW50Lk1ldGhvZHMpLEJVVFRPTjpPYmplY3QuY2xvbmUoRm9ybS5FbGVtZW50Lk1ldGhvZHMpfSl9YUYuYWRkTWV0aG9kcyhhMyk7ZnVuY3Rpb24gbigpe2F2PW51bGw7cj1udWxsfWlmKHdpbmRvdy5hdHRhY2hFdmVudCl7d2luZG93LmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsbil9fSkodGhpcyk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gayhHKXt2YXIgRj1HLm1hdGNoKC9eKFxkKyklPyQvaSk7aWYoIUYpe3JldHVybiBudWxsfXJldHVybihOdW1iZXIoRlsxXSkvMTAwKX1mdW5jdGlvbiB5KEcsSCl7Rz0kKEcpO3ZhciBJPUcuc3R5bGVbSF07aWYoIUl8fEk9PT0iYXV0byIpe3ZhciBGPWRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoRyxudWxsKTtJPUY/RltIXTpudWxsfWlmKEg9PT0ib3BhY2l0eSIpe3JldHVybiBJP3BhcnNlRmxvYXQoSSk6MX1yZXR1cm4gST09PSJhdXRvIj9udWxsOkl9ZnVuY3Rpb24gQihGLEcpe3ZhciBIPUYuc3R5bGVbR107aWYoIUgmJkYuY3VycmVudFN0eWxlKXtIPUYuY3VycmVudFN0eWxlW0ddfXJldHVybiBIfWZ1bmN0aW9uIHIoSCxHKXt2YXIgSj1ILm9mZnNldFdpZHRoO3ZhciBMPXUoSCwiYm9yZGVyTGVmdFdpZHRoIixHKXx8MDt2YXIgRj11KEgsImJvcmRlclJpZ2h0V2lkdGgiLEcpfHwwO3ZhciBJPXUoSCwicGFkZGluZ0xlZnQiLEcpfHwwO3ZhciBLPXUoSCwicGFkZGluZ1JpZ2h0IixHKXx8MDtyZXR1cm4gSi1MLUYtSS1LfWlmKCFPYmplY3QuaXNVbmRlZmluZWQoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSkmJiFQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSl7eT1CfWZ1bmN0aW9uIHUoUCxRLEcpe3ZhciBKPW51bGw7aWYoT2JqZWN0LmlzRWxlbWVudChQKSl7Sj1QO1A9eShKLFEpfWlmKFA9PT1udWxsfHxPYmplY3QuaXNVbmRlZmluZWQoUCkpe3JldHVybiBudWxsfWlmKCgvXig/Oi0pP1xkKyhcLlxkKyk/KHB4KT8kL2kpLnRlc3QoUCkpe3JldHVybiB3aW5kb3cucGFyc2VGbG9hdChQKX12YXIgSz1QLmluY2x1ZGUoIiUiKSxIPShHPT09ZG9jdW1lbnQudmlld3BvcnQpO2lmKC9cZC8udGVzdChQKSYmSiYmSi5ydW50aW1lU3R5bGUmJiEoSyYmSCkpe3ZhciBGPUouc3R5bGUubGVmdCxPPUoucnVudGltZVN0eWxlLmxlZnQ7Si5ydW50aW1lU3R5bGUubGVmdD1KLmN1cnJlbnRTdHlsZS5sZWZ0O0ouc3R5bGUubGVmdD1QfHwwO1A9Si5zdHlsZS5waXhlbExlZnQ7Si5zdHlsZS5sZWZ0PUY7Si5ydW50aW1lU3R5bGUubGVmdD1PO3JldHVybiBQfWlmKEomJkspe0c9R3x8Si5wYXJlbnROb2RlO3ZhciBJPWsoUCksTD1udWxsO3ZhciBOPVEuaW5jbHVkZSgibGVmdCIpfHxRLmluY2x1ZGUoInJpZ2h0Iil8fFEuaW5jbHVkZSgid2lkdGgiKTt2YXIgTT1RLmluY2x1ZGUoInRvcCIpfHxRLmluY2x1ZGUoImJvdHRvbSIpfHxRLmluY2x1ZGUoImhlaWdodCIpO2lmKEc9PT1kb2N1bWVudC52aWV3cG9ydCl7aWYoTil7TD1kb2N1bWVudC52aWV3cG9ydC5nZXRXaWR0aCgpfWVsc2V7aWYoTSl7TD1kb2N1bWVudC52aWV3cG9ydC5nZXRIZWlnaHQoKX19fWVsc2V7aWYoTil7TD0kKEcpLm1lYXN1cmUoIndpZHRoIil9ZWxzZXtpZihNKXtMPSQoRykubWVhc3VyZSgiaGVpZ2h0Iil9fX1yZXR1cm4oTD09PW51bGwpPzA6TCpJfXJldHVybiAwfWZ1bmN0aW9uIGooRil7aWYoT2JqZWN0LmlzU3RyaW5nKEYpJiZGLmVuZHNXaXRoKCJweCIpKXtyZXR1cm4gRn1yZXR1cm4gRisicHgifWZ1bmN0aW9uIG0oRil7d2hpbGUoRiYmRi5wYXJlbnROb2RlKXt2YXIgRz1GLmdldFN0eWxlKCJkaXNwbGF5Iik7aWYoRz09PSJub25lIil7cmV0dXJuIGZhbHNlfUY9JChGLnBhcmVudE5vZGUpfXJldHVybiB0cnVlfXZhciBnPVByb3RvdHlwZS5LO2lmKCJjdXJyZW50U3R5bGUiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCl7Zz1mdW5jdGlvbihGKXtpZighRi5jdXJyZW50U3R5bGUuaGFzTGF5b3V0KXtGLnN0eWxlLnpvb209MX1yZXR1cm4gRn19ZnVuY3Rpb24gaShGKXtpZihGLmluY2x1ZGUoImJvcmRlciIpKXtGPUYrIi13aWR0aCJ9cmV0dXJuIEYuY2FtZWxpemUoKX1FbGVtZW50LkxheW91dD1DbGFzcy5jcmVhdGUoSGFzaCx7aW5pdGlhbGl6ZTpmdW5jdGlvbigkc3VwZXIsRyxGKXskc3VwZXIoKTt0aGlzLmVsZW1lbnQ9JChHKTtFbGVtZW50LkxheW91dC5QUk9QRVJUSUVTLmVhY2goZnVuY3Rpb24oSCl7dGhpcy5fc2V0KEgsbnVsbCl9LHRoaXMpO2lmKEYpe3RoaXMuX3ByZUNvbXB1dGluZz10cnVlO3RoaXMuX2JlZ2luKCk7RWxlbWVudC5MYXlvdXQuUFJPUEVSVElFUy5lYWNoKHRoaXMuX2NvbXB1dGUsdGhpcyk7dGhpcy5fZW5kKCk7dGhpcy5fcHJlQ29tcHV0aW5nPWZhbHNlfX0sX3NldDpmdW5jdGlvbihHLEYpe3JldHVybiBIYXNoLnByb3RvdHlwZS5zZXQuY2FsbCh0aGlzLEcsRil9LHNldDpmdW5jdGlvbihHLEYpe3Rocm93IlByb3BlcnRpZXMgb2YgRWxlbWVudC5MYXlvdXQgYXJlIHJlYWQtb25seS4ifSxnZXQ6ZnVuY3Rpb24oJHN1cGVyLEcpe3ZhciBGPSRzdXBlcihHKTtyZXR1cm4gRj09PW51bGw/dGhpcy5fY29tcHV0ZShHKTpGfSxfYmVnaW46ZnVuY3Rpb24oKXtpZih0aGlzLl9pc1ByZXBhcmVkKCkpe3JldHVybn12YXIgSj10aGlzLmVsZW1lbnQ7aWYobShKKSl7dGhpcy5fc2V0UHJlcGFyZWQodHJ1ZSk7cmV0dXJufXZhciBMPXtwb3NpdGlvbjpKLnN0eWxlLnBvc2l0aW9ufHwiIix3aWR0aDpKLnN0eWxlLndpZHRofHwiIix2aXNpYmlsaXR5Okouc3R5bGUudmlzaWJpbGl0eXx8IiIsZGlzcGxheTpKLnN0eWxlLmRpc3BsYXl8fCIifTtKLnN0b3JlKCJwcm90b3R5cGVfb3JpZ2luYWxfc3R5bGVzIixMKTt2YXIgTT15KEosInBvc2l0aW9uIiksRj1KLm9mZnNldFdpZHRoO2lmKEY9PT0wfHxGPT09bnVsbCl7Si5zdHlsZS5kaXNwbGF5PSJibG9jayI7Rj1KLm9mZnNldFdpZHRofXZhciBHPShNPT09ImZpeGVkIik/ZG9jdW1lbnQudmlld3BvcnQ6Si5wYXJlbnROb2RlO3ZhciBOPXt2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn07aWYoTSE9PSJmaXhlZCIpe04ucG9zaXRpb249ImFic29sdXRlIn1KLnNldFN0eWxlKE4pO3ZhciBIPUoub2Zmc2V0V2lkdGgsSTtpZihGJiYoSD09PUYpKXtJPXIoSixHKX1lbHNle2lmKE09PT0iYWJzb2x1dGUifHxNPT09ImZpeGVkIil7ST1yKEosRyl9ZWxzZXt2YXIgTz1KLnBhcmVudE5vZGUsSz0kKE8pLmdldExheW91dCgpO0k9Sy5nZXQoIndpZHRoIiktdGhpcy5nZXQoIm1hcmdpbi1sZWZ0IiktdGhpcy5nZXQoImJvcmRlci1sZWZ0IiktdGhpcy5nZXQoInBhZGRpbmctbGVmdCIpLXRoaXMuZ2V0KCJwYWRkaW5nLXJpZ2h0IiktdGhpcy5nZXQoImJvcmRlci1yaWdodCIpLXRoaXMuZ2V0KCJtYXJnaW4tcmlnaHQiKX19Si5zZXRTdHlsZSh7d2lkdGg6SSsicHgifSk7dGhpcy5fc2V0UHJlcGFyZWQodHJ1ZSl9LF9lbmQ6ZnVuY3Rpb24oKXt2YXIgRz10aGlzLmVsZW1lbnQ7dmFyIEY9Ry5yZXRyaWV2ZSgicHJvdG90eXBlX29yaWdpbmFsX3N0eWxlcyIpO0cuc3RvcmUoInByb3RvdHlwZV9vcmlnaW5hbF9zdHlsZXMiLG51bGwpO0cuc2V0U3R5bGUoRik7dGhpcy5fc2V0UHJlcGFyZWQoZmFsc2UpfSxfY29tcHV0ZTpmdW5jdGlvbihHKXt2YXIgRj1FbGVtZW50LkxheW91dC5DT01QVVRBVElPTlM7aWYoIShHIGluIEYpKXt0aHJvdyJQcm9wZXJ0eSBub3QgZm91bmQuIn1yZXR1cm4gdGhpcy5fc2V0KEcsRltHXS5jYWxsKHRoaXMsdGhpcy5lbGVtZW50KSl9LF9pc1ByZXBhcmVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5yZXRyaWV2ZSgicHJvdG90eXBlX2VsZW1lbnRfbGF5b3V0X3ByZXBhcmVkIixmYWxzZSl9LF9zZXRQcmVwYXJlZDpmdW5jdGlvbihGKXtyZXR1cm4gdGhpcy5lbGVtZW50LnN0b3JlKCJwcm90b3R5cGVfZWxlbWVudF9sYXlvdXRfcHJlcGFyZWQiLEYpfSx0b09iamVjdDpmdW5jdGlvbigpe3ZhciBGPSRBKGFyZ3VtZW50cyk7dmFyIEc9KEYubGVuZ3RoPT09MCk/RWxlbWVudC5MYXlvdXQuUFJPUEVSVElFUzpGLmpvaW4oIiAiKS5zcGxpdCgiICIpO3ZhciBIPXt9O0cuZWFjaChmdW5jdGlvbihJKXtpZighRWxlbWVudC5MYXlvdXQuUFJPUEVSVElFUy5pbmNsdWRlKEkpKXtyZXR1cm59dmFyIEo9dGhpcy5nZXQoSSk7aWYoSiE9bnVsbCl7SFtJXT1KfX0sdGhpcyk7cmV0dXJuIEh9LHRvSGFzaDpmdW5jdGlvbigpe3ZhciBGPXRoaXMudG9PYmplY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBuZXcgSGFzaChGKX0sdG9DU1M6ZnVuY3Rpb24oKXt2YXIgRj0kQShhcmd1bWVudHMpO3ZhciBIPShGLmxlbmd0aD09PTApP0VsZW1lbnQuTGF5b3V0LlBST1BFUlRJRVM6Ri5qb2luKCIgIikuc3BsaXQoIiAiKTt2YXIgRz17fTtILmVhY2goZnVuY3Rpb24oSSl7aWYoIUVsZW1lbnQuTGF5b3V0LlBST1BFUlRJRVMuaW5jbHVkZShJKSl7cmV0dXJufWlmKEVsZW1lbnQuTGF5b3V0LkNPTVBPU0lURV9QUk9QRVJUSUVTLmluY2x1ZGUoSSkpe3JldHVybn12YXIgSj10aGlzLmdldChJKTtpZihKIT1udWxsKXtHW2koSSldPUorInB4In19LHRoaXMpO3JldHVybiBHfSxpbnNwZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIiM8RWxlbWVudC5MYXlvdXQ+In19KTtPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTGF5b3V0LHtQUk9QRVJUSUVTOiR3KCJoZWlnaHQgd2lkdGggdG9wIGxlZnQgcmlnaHQgYm90dG9tIGJvcmRlci1sZWZ0IGJvcmRlci1yaWdodCBib3JkZXItdG9wIGJvcmRlci1ib3R0b20gcGFkZGluZy1sZWZ0IHBhZGRpbmctcmlnaHQgcGFkZGluZy10b3AgcGFkZGluZy1ib3R0b20gbWFyZ2luLXRvcCBtYXJnaW4tYm90dG9tIG1hcmdpbi1sZWZ0IG1hcmdpbi1yaWdodCBwYWRkaW5nLWJveC13aWR0aCBwYWRkaW5nLWJveC1oZWlnaHQgYm9yZGVyLWJveC13aWR0aCBib3JkZXItYm94LWhlaWdodCBtYXJnaW4tYm94LXdpZHRoIG1hcmdpbi1ib3gtaGVpZ2h0IiksQ09NUE9TSVRFX1BST1BFUlRJRVM6JHcoInBhZGRpbmctYm94LXdpZHRoIHBhZGRpbmctYm94LWhlaWdodCBtYXJnaW4tYm94LXdpZHRoIG1hcmdpbi1ib3gtaGVpZ2h0IGJvcmRlci1ib3gtd2lkdGggYm9yZGVyLWJveC1oZWlnaHQiKSxDT01QVVRBVElPTlM6e2hlaWdodDpmdW5jdGlvbihIKXtpZighdGhpcy5fcHJlQ29tcHV0aW5nKXt0aGlzLl9iZWdpbigpfXZhciBGPXRoaXMuZ2V0KCJib3JkZXItYm94LWhlaWdodCIpO2lmKEY8PTApe2lmKCF0aGlzLl9wcmVDb21wdXRpbmcpe3RoaXMuX2VuZCgpfXJldHVybiAwfXZhciBJPXRoaXMuZ2V0KCJib3JkZXItdG9wIiksRz10aGlzLmdldCgiYm9yZGVyLWJvdHRvbSIpO3ZhciBLPXRoaXMuZ2V0KCJwYWRkaW5nLXRvcCIpLEo9dGhpcy5nZXQoInBhZGRpbmctYm90dG9tIik7aWYoIXRoaXMuX3ByZUNvbXB1dGluZyl7dGhpcy5fZW5kKCl9cmV0dXJuIEYtSS1HLUstSn0sd2lkdGg6ZnVuY3Rpb24oSCl7aWYoIXRoaXMuX3ByZUNvbXB1dGluZyl7dGhpcy5fYmVnaW4oKX12YXIgRz10aGlzLmdldCgiYm9yZGVyLWJveC13aWR0aCIpO2lmKEc8PTApe2lmKCF0aGlzLl9wcmVDb21wdXRpbmcpe3RoaXMuX2VuZCgpfXJldHVybiAwfXZhciBLPXRoaXMuZ2V0KCJib3JkZXItbGVmdCIpLEY9dGhpcy5nZXQoImJvcmRlci1yaWdodCIpO3ZhciBJPXRoaXMuZ2V0KCJwYWRkaW5nLWxlZnQiKSxKPXRoaXMuZ2V0KCJwYWRkaW5nLXJpZ2h0Iik7aWYoIXRoaXMuX3ByZUNvbXB1dGluZyl7dGhpcy5fZW5kKCl9cmV0dXJuIEctSy1GLUktSn0sInBhZGRpbmctYm94LWhlaWdodCI6ZnVuY3Rpb24oRyl7dmFyIEY9dGhpcy5nZXQoImhlaWdodCIpLEk9dGhpcy5nZXQoInBhZGRpbmctdG9wIiksSD10aGlzLmdldCgicGFkZGluZy1ib3R0b20iKTtyZXR1cm4gRitJK0h9LCJwYWRkaW5nLWJveC13aWR0aCI6ZnVuY3Rpb24oRil7dmFyIEc9dGhpcy5nZXQoIndpZHRoIiksSD10aGlzLmdldCgicGFkZGluZy1sZWZ0IiksST10aGlzLmdldCgicGFkZGluZy1yaWdodCIpO3JldHVybiBHK0grSX0sImJvcmRlci1ib3gtaGVpZ2h0IjpmdW5jdGlvbihHKXtpZighdGhpcy5fcHJlQ29tcHV0aW5nKXt0aGlzLl9iZWdpbigpfXZhciBGPUcub2Zmc2V0SGVpZ2h0O2lmKCF0aGlzLl9wcmVDb21wdXRpbmcpe3RoaXMuX2VuZCgpfXJldHVybiBGfSwiYm9yZGVyLWJveC13aWR0aCI6ZnVuY3Rpb24oRil7aWYoIXRoaXMuX3ByZUNvbXB1dGluZyl7dGhpcy5fYmVnaW4oKX12YXIgRz1GLm9mZnNldFdpZHRoO2lmKCF0aGlzLl9wcmVDb21wdXRpbmcpe3RoaXMuX2VuZCgpfXJldHVybiBHfSwibWFyZ2luLWJveC1oZWlnaHQiOmZ1bmN0aW9uKEcpe3ZhciBGPXRoaXMuZ2V0KCJib3JkZXItYm94LWhlaWdodCIpLEg9dGhpcy5nZXQoIm1hcmdpbi10b3AiKSxJPXRoaXMuZ2V0KCJtYXJnaW4tYm90dG9tIik7aWYoRjw9MCl7cmV0dXJuIDB9cmV0dXJuIEYrSCtJfSwibWFyZ2luLWJveC13aWR0aCI6ZnVuY3Rpb24oSCl7dmFyIEc9dGhpcy5nZXQoImJvcmRlci1ib3gtd2lkdGgiKSxJPXRoaXMuZ2V0KCJtYXJnaW4tbGVmdCIpLEY9dGhpcy5nZXQoIm1hcmdpbi1yaWdodCIpO2lmKEc8PTApe3JldHVybiAwfXJldHVybiBHK0krRn0sdG9wOmZ1bmN0aW9uKEYpe3ZhciBHPUYucG9zaXRpb25lZE9mZnNldCgpO3JldHVybiBHLnRvcH0sYm90dG9tOmZ1bmN0aW9uKEYpe3ZhciBJPUYucG9zaXRpb25lZE9mZnNldCgpLEc9Ri5nZXRPZmZzZXRQYXJlbnQoKSxIPUcubWVhc3VyZSgiaGVpZ2h0Iik7dmFyIEo9dGhpcy5nZXQoImJvcmRlci1ib3gtaGVpZ2h0Iik7cmV0dXJuIEgtSi1JLnRvcH0sbGVmdDpmdW5jdGlvbihGKXt2YXIgRz1GLnBvc2l0aW9uZWRPZmZzZXQoKTtyZXR1cm4gRy5sZWZ0fSxyaWdodDpmdW5jdGlvbihIKXt2YXIgSj1ILnBvc2l0aW9uZWRPZmZzZXQoKSxJPUguZ2V0T2Zmc2V0UGFyZW50KCksRj1JLm1lYXN1cmUoIndpZHRoIik7dmFyIEc9dGhpcy5nZXQoImJvcmRlci1ib3gtd2lkdGgiKTtyZXR1cm4gRi1HLUoubGVmdH0sInBhZGRpbmctdG9wIjpmdW5jdGlvbihGKXtyZXR1cm4gdShGLCJwYWRkaW5nVG9wIil9LCJwYWRkaW5nLWJvdHRvbSI6ZnVuY3Rpb24oRil7cmV0dXJuIHUoRiwicGFkZGluZ0JvdHRvbSIpfSwicGFkZGluZy1sZWZ0IjpmdW5jdGlvbihGKXtyZXR1cm4gdShGLCJwYWRkaW5nTGVmdCIpfSwicGFkZGluZy1yaWdodCI6ZnVuY3Rpb24oRil7cmV0dXJuIHUoRiwicGFkZGluZ1JpZ2h0Iil9LCJib3JkZXItdG9wIjpmdW5jdGlvbihGKXtyZXR1cm4gdShGLCJib3JkZXJUb3BXaWR0aCIpfSwiYm9yZGVyLWJvdHRvbSI6ZnVuY3Rpb24oRil7cmV0dXJuIHUoRiwiYm9yZGVyQm90dG9tV2lkdGgiKX0sImJvcmRlci1sZWZ0IjpmdW5jdGlvbihGKXtyZXR1cm4gdShGLCJib3JkZXJMZWZ0V2lkdGgiKX0sImJvcmRlci1yaWdodCI6ZnVuY3Rpb24oRil7cmV0dXJuIHUoRiwiYm9yZGVyUmlnaHRXaWR0aCIpfSwibWFyZ2luLXRvcCI6ZnVuY3Rpb24oRil7cmV0dXJuIHUoRiwibWFyZ2luVG9wIil9LCJtYXJnaW4tYm90dG9tIjpmdW5jdGlvbihGKXtyZXR1cm4gdShGLCJtYXJnaW5Cb3R0b20iKX0sIm1hcmdpbi1sZWZ0IjpmdW5jdGlvbihGKXtyZXR1cm4gdShGLCJtYXJnaW5MZWZ0Iil9LCJtYXJnaW4tcmlnaHQiOmZ1bmN0aW9uKEYpe3JldHVybiB1KEYsIm1hcmdpblJpZ2h0Iil9fX0pO2lmKCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCl7T2JqZWN0LmV4dGVuZChFbGVtZW50LkxheW91dC5DT01QVVRBVElPTlMse3JpZ2h0OmZ1bmN0aW9uKEcpe3ZhciBIPWcoRy5nZXRPZmZzZXRQYXJlbnQoKSk7dmFyIEk9Ry5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxGPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuKEYucmlnaHQtSS5yaWdodCkucm91bmQoKX0sYm90dG9tOmZ1bmN0aW9uKEcpe3ZhciBIPWcoRy5nZXRPZmZzZXRQYXJlbnQoKSk7dmFyIEk9Ry5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxGPUguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuKEYuYm90dG9tLUkuYm90dG9tKS5yb3VuZCgpfX0pfUVsZW1lbnQuT2Zmc2V0PUNsYXNzLmNyZWF0ZSh7aW5pdGlhbGl6ZTpmdW5jdGlvbihHLEYpe3RoaXMubGVmdD1HLnJvdW5kKCk7dGhpcy50b3A9Ri5yb3VuZCgpO3RoaXNbMF09dGhpcy5sZWZ0O3RoaXNbMV09dGhpcy50b3B9LHJlbGF0aXZlVG86ZnVuY3Rpb24oRil7cmV0dXJuIG5ldyBFbGVtZW50Lk9mZnNldCh0aGlzLmxlZnQtRi5sZWZ0LHRoaXMudG9wLUYudG9wKX0saW5zcGVjdDpmdW5jdGlvbigpe3JldHVybiIjPEVsZW1lbnQuT2Zmc2V0IGxlZnQ6ICN7bGVmdH0gdG9wOiAje3RvcH0+Ii5pbnRlcnBvbGF0ZSh0aGlzKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iWyN7bGVmdH0sICN7dG9wfV0iLmludGVycG9sYXRlKHRoaXMpfSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMubGVmdCx0aGlzLnRvcF19fSk7ZnVuY3Rpb24geihHLEYpe3JldHVybiBuZXcgRWxlbWVudC5MYXlvdXQoRyxGKX1mdW5jdGlvbiBkKEYsRyl7cmV0dXJuICQoRikuZ2V0TGF5b3V0KCkuZ2V0KEcpfWZ1bmN0aW9uIHEoRil7cmV0dXJuIEVsZW1lbnQuZ2V0RGltZW5zaW9ucyhGKS5oZWlnaHR9ZnVuY3Rpb24gYyhGKXtyZXR1cm4gRWxlbWVudC5nZXREaW1lbnNpb25zKEYpLndpZHRofWZ1bmN0aW9uIHMoRyl7Rz0kKEcpO3ZhciBLPUVsZW1lbnQuZ2V0U3R5bGUoRywiZGlzcGxheSIpO2lmKEsmJkshPT0ibm9uZSIpe3JldHVybnt3aWR0aDpHLm9mZnNldFdpZHRoLGhlaWdodDpHLm9mZnNldEhlaWdodH19dmFyIEg9Ry5zdHlsZTt2YXIgRj17dmlzaWJpbGl0eTpILnZpc2liaWxpdHkscG9zaXRpb246SC5wb3NpdGlvbixkaXNwbGF5OkguZGlzcGxheX07dmFyIEo9e3Zpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifTtpZihGLnBvc2l0aW9uIT09ImZpeGVkIil7Si5wb3NpdGlvbj0iYWJzb2x1dGUifUVsZW1lbnQuc2V0U3R5bGUoRyxKKTt2YXIgST17d2lkdGg6Ry5vZmZzZXRXaWR0aCxoZWlnaHQ6Ry5vZmZzZXRIZWlnaHR9O0VsZW1lbnQuc2V0U3R5bGUoRyxGKTtyZXR1cm4gSX1mdW5jdGlvbiBwKEYpe0Y9JChGKTtmdW5jdGlvbiBIKEkpe3JldHVybiBuKEkpPyQoZG9jdW1lbnQuYm9keSk6JChJKX1pZihoKEYpfHxmKEYpfHxvKEYpfHxuKEYpKXtyZXR1cm4gJChkb2N1bWVudC5ib2R5KX12YXIgRz0oRWxlbWVudC5nZXRTdHlsZShGLCJkaXNwbGF5Iik9PT0iaW5saW5lIik7aWYoIUcmJkYub2Zmc2V0UGFyZW50KXtyZXR1cm4gSChGLm9mZnNldFBhcmVudCl9d2hpbGUoKEY9Ri5wYXJlbnROb2RlKSYmRiE9PWRvY3VtZW50LmJvZHkpe2lmKEVsZW1lbnQuZ2V0U3R5bGUoRiwicG9zaXRpb24iKSE9PSJzdGF0aWMiKXtyZXR1cm4gSChGKX19cmV0dXJuICQoZG9jdW1lbnQuYm9keSl9ZnVuY3Rpb24gQyhHKXtHPSQoRyk7dmFyIEY9MCxIPTA7aWYoRy5wYXJlbnROb2RlKXtkb3tGKz1HLm9mZnNldFRvcHx8MDtIKz1HLm9mZnNldExlZnR8fDA7Rz1HLm9mZnNldFBhcmVudH13aGlsZShHKX1yZXR1cm4gbmV3IEVsZW1lbnQuT2Zmc2V0KEgsRil9ZnVuY3Rpb24gdyhHKXtHPSQoRyk7dmFyIEg9Ry5nZXRMYXlvdXQoKTt2YXIgRj0wLEo9MDtkb3tGKz1HLm9mZnNldFRvcHx8MDtKKz1HLm9mZnNldExlZnR8fDA7Rz1HLm9mZnNldFBhcmVudDtpZihHKXtpZihvKEcpKXticmVha312YXIgST1FbGVtZW50LmdldFN0eWxlKEcsInBvc2l0aW9uIik7aWYoSSE9PSJzdGF0aWMiKXticmVha319fXdoaWxlKEcpO0otPUguZ2V0KCJtYXJnaW4tbGVmdCIpO0YtPUguZ2V0KCJtYXJnaW4tdG9wIik7cmV0dXJuIG5ldyBFbGVtZW50Lk9mZnNldChKLEYpfWZ1bmN0aW9uIGIoRyl7dmFyIEY9MCxIPTA7ZG97aWYoRz09PWRvY3VtZW50LmJvZHkpe3ZhciBJPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5O0YrPSFPYmplY3QuaXNVbmRlZmluZWQod2luZG93LnBhZ2VZT2Zmc2V0KT93aW5kb3cucGFnZVlPZmZzZXQ6SS5zY3JvbGxUb3B8fDA7SCs9IU9iamVjdC5pc1VuZGVmaW5lZCh3aW5kb3cucGFnZVhPZmZzZXQpP3dpbmRvdy5wYWdlWE9mZnNldDpJLnNjcm9sbExlZnR8fDA7YnJlYWt9ZWxzZXtGKz1HLnNjcm9sbFRvcHx8MDtIKz1HLnNjcm9sbExlZnR8fDA7Rz1HLnBhcmVudE5vZGV9fXdoaWxlKEcpO3JldHVybiBuZXcgRWxlbWVudC5PZmZzZXQoSCxGKX1mdW5jdGlvbiBBKEope3ZhciBGPTAsST0wLEg9ZG9jdW1lbnQuYm9keTtKPSQoSik7dmFyIEc9Sjtkb3tGKz1HLm9mZnNldFRvcHx8MDtJKz1HLm9mZnNldExlZnR8fDA7aWYoRy5vZmZzZXRQYXJlbnQ9PUgmJkVsZW1lbnQuZ2V0U3R5bGUoRywicG9zaXRpb24iKT09ImFic29sdXRlIil7YnJlYWt9fXdoaWxlKEc9Ry5vZmZzZXRQYXJlbnQpO0c9Sjtkb3tpZihHIT1IKXtGLT1HLnNjcm9sbFRvcHx8MDtJLT1HLnNjcm9sbExlZnR8fDB9fXdoaWxlKEc9Ry5wYXJlbnROb2RlKTtyZXR1cm4gbmV3IEVsZW1lbnQuT2Zmc2V0KEksRil9ZnVuY3Rpb24geChGKXtGPSQoRik7aWYoRWxlbWVudC5nZXRTdHlsZShGLCJwb3NpdGlvbiIpPT09ImFic29sdXRlIil7cmV0dXJuIEZ9dmFyIEo9cChGKTt2YXIgST1GLnZpZXdwb3J0T2Zmc2V0KCksRz1KLnZpZXdwb3J0T2Zmc2V0KCk7dmFyIEs9SS5yZWxhdGl2ZVRvKEcpO3ZhciBIPUYuZ2V0TGF5b3V0KCk7Ri5zdG9yZSgicHJvdG90eXBlX2Fic29sdXRpemVfb3JpZ2luYWxfc3R5bGVzIix7cG9zaXRpb246Ri5nZXRTdHlsZSgicG9zaXRpb24iKSxsZWZ0OkYuZ2V0U3R5bGUoImxlZnQiKSx0b3A6Ri5nZXRTdHlsZSgidG9wIiksd2lkdGg6Ri5nZXRTdHlsZSgid2lkdGgiKSxoZWlnaHQ6Ri5nZXRTdHlsZSgiaGVpZ2h0Iil9KTtGLnNldFN0eWxlKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDpLLnRvcCsicHgiLGxlZnQ6Sy5sZWZ0KyJweCIsd2lkdGg6SC5nZXQoIndpZHRoIikrInB4IixoZWlnaHQ6SC5nZXQoImhlaWdodCIpKyJweCJ9KTtyZXR1cm4gRn1mdW5jdGlvbiBsKEcpe0c9JChHKTtpZihFbGVtZW50LmdldFN0eWxlKEcsInBvc2l0aW9uIik9PT0icmVsYXRpdmUiKXtyZXR1cm4gR312YXIgRj1HLnJldHJpZXZlKCJwcm90b3R5cGVfYWJzb2x1dGl6ZV9vcmlnaW5hbF9zdHlsZXMiKTtpZihGKXtHLnNldFN0eWxlKEYpfXJldHVybiBHfWZ1bmN0aW9uIGEoRil7Rj0kKEYpO3ZhciBHPUVsZW1lbnQuY3VtdWxhdGl2ZU9mZnNldChGKTt3aW5kb3cuc2Nyb2xsVG8oRy5sZWZ0LEcudG9wKTtyZXR1cm4gRn1mdW5jdGlvbiB2KEcpe0c9JChHKTt2YXIgRj1FbGVtZW50LmdldFN0eWxlKEcsInBvc2l0aW9uIiksSD17fTtpZihGPT09InN0YXRpYyJ8fCFGKXtILnBvc2l0aW9uPSJyZWxhdGl2ZSI7aWYoUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpe0gudG9wPTA7SC5sZWZ0PTB9RWxlbWVudC5zZXRTdHlsZShHLEgpO0VsZW1lbnQuc3RvcmUoRywicHJvdG90eXBlX21hZGVfcG9zaXRpb25lZCIsdHJ1ZSl9cmV0dXJuIEd9ZnVuY3Rpb24gdChGKXtGPSQoRik7dmFyIEg9RWxlbWVudC5nZXRTdG9yYWdlKEYpLEc9SC5nZXQoInByb3RvdHlwZV9tYWRlX3Bvc2l0aW9uZWQiKTtpZihHKXtILnVuc2V0KCJwcm90b3R5cGVfbWFkZV9wb3NpdGlvbmVkIik7RWxlbWVudC5zZXRTdHlsZShGLHtwb3NpdGlvbjoiIix0b3A6IiIsYm90dG9tOiIiLGxlZnQ6IiIscmlnaHQ6IiJ9KX1yZXR1cm4gRn1mdW5jdGlvbiBlKEcpe0c9JChHKTt2YXIgST1FbGVtZW50LmdldFN0b3JhZ2UoRyksRj1JLmdldCgicHJvdG90eXBlX21hZGVfY2xpcHBpbmciKTtpZihPYmplY3QuaXNVbmRlZmluZWQoRikpe3ZhciBIPUVsZW1lbnQuZ2V0U3R5bGUoRywib3ZlcmZsb3ciKTtJLnNldCgicHJvdG90eXBlX21hZGVfY2xpcHBpbmciLEgpO2lmKEghPT0iaGlkZGVuIil7Ry5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIn19cmV0dXJuIEd9ZnVuY3Rpb24gRChGKXtGPSQoRik7dmFyIEg9RWxlbWVudC5nZXRTdG9yYWdlKEYpLEc9SC5nZXQoInByb3RvdHlwZV9tYWRlX2NsaXBwaW5nIik7aWYoIU9iamVjdC5pc1VuZGVmaW5lZChHKSl7SC51bnNldCgicHJvdG90eXBlX21hZGVfY2xpcHBpbmciKTtGLnN0eWxlLm92ZXJmbG93PUd8fCIifXJldHVybiBGfWZ1bmN0aW9uIEUoSSxGLFEpe1E9T2JqZWN0LmV4dGVuZCh7c2V0TGVmdDp0cnVlLHNldFRvcDp0cnVlLHNldFdpZHRoOnRydWUsc2V0SGVpZ2h0OnRydWUsb2Zmc2V0VG9wOjAsb2Zmc2V0TGVmdDowfSxRfHx7fSk7dmFyIEg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O0Y9JChGKTtJPSQoSSk7dmFyIEcsTyxLLFA9e307aWYoUS5zZXRMZWZ0fHxRLnNldFRvcCl7Rz1FbGVtZW50LnZpZXdwb3J0T2Zmc2V0KEYpO089WzAsMF07aWYoRWxlbWVudC5nZXRTdHlsZShJLCJwb3NpdGlvbiIpPT09ImFic29sdXRlIil7dmFyIE49RWxlbWVudC5nZXRPZmZzZXRQYXJlbnQoSSk7aWYoTiE9PWRvY3VtZW50LmJvZHkpe089RWxlbWVudC52aWV3cG9ydE9mZnNldChOKX19fWZ1bmN0aW9uIEwoKXt2YXIgUj0wLFM9MDtpZihPYmplY3QuaXNOdW1iZXIod2luZG93LnBhZ2VYT2Zmc2V0KSl7Uj13aW5kb3cucGFnZVhPZmZzZXQ7Uz13aW5kb3cucGFnZVlPZmZzZXR9ZWxzZXtpZihkb2N1bWVudC5ib2R5JiYoZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0fHxkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCkpe1I9ZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0O1M9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3B9ZWxzZXtpZihIJiYoSC5zY3JvbGxMZWZ0fHxILnNjcm9sbFRvcCkpe1I9SC5zY3JvbGxMZWZ0O1M9SC5zY3JvbGxUb3B9fX1yZXR1cm57eDpSLHk6U319dmFyIEo9TCgpO2lmKFEuc2V0V2lkdGh8fFEuc2V0SGVpZ2h0KXtLPUVsZW1lbnQuZ2V0TGF5b3V0KEYpfWlmKFEuc2V0TGVmdCl7UC5sZWZ0PShHWzBdK0oueC1PWzBdK1Eub2Zmc2V0TGVmdCkrInB4In1pZihRLnNldFRvcCl7UC50b3A9KEdbMV0rSi55LU9bMV0rUS5vZmZzZXRUb3ApKyJweCJ9dmFyIE09SS5nZXRMYXlvdXQoKTtpZihRLnNldFdpZHRoKXtQLndpZHRoPUsuZ2V0KCJ3aWR0aCIpKyJweCJ9aWYoUS5zZXRIZWlnaHQpe1AuaGVpZ2h0PUsuZ2V0KCJoZWlnaHQiKSsicHgifXJldHVybiBFbGVtZW50LnNldFN0eWxlKEksUCl9aWYoUHJvdG90eXBlLkJyb3dzZXIuSUUpe3A9cC53cmFwKGZ1bmN0aW9uKEgsRyl7Rz0kKEcpO2lmKGgoRyl8fGYoRyl8fG8oRyl8fG4oRykpe3JldHVybiAkKGRvY3VtZW50LmJvZHkpfXZhciBGPUcuZ2V0U3R5bGUoInBvc2l0aW9uIik7aWYoRiE9PSJzdGF0aWMiKXtyZXR1cm4gSChHKX1HLnNldFN0eWxlKHtwb3NpdGlvbjoicmVsYXRpdmUifSk7dmFyIEk9SChHKTtHLnNldFN0eWxlKHtwb3NpdGlvbjpGfSk7cmV0dXJuIEl9KTt3PXcud3JhcChmdW5jdGlvbihJLEcpe0c9JChHKTtpZighRy5wYXJlbnROb2RlKXtyZXR1cm4gbmV3IEVsZW1lbnQuT2Zmc2V0KDAsMCl9dmFyIEY9Ry5nZXRTdHlsZSgicG9zaXRpb24iKTtpZihGIT09InN0YXRpYyIpe3JldHVybiBJKEcpfXZhciBIPUcuZ2V0T2Zmc2V0UGFyZW50KCk7aWYoSCYmSC5nZXRTdHlsZSgicG9zaXRpb24iKT09PSJmaXhlZCIpe2coSCl9Ry5zZXRTdHlsZSh7cG9zaXRpb246InJlbGF0aXZlIn0pO3ZhciBKPUkoRyk7Ry5zZXRTdHlsZSh7cG9zaXRpb246Rn0pO3JldHVybiBKfSl9ZWxzZXtpZihQcm90b3R5cGUuQnJvd3Nlci5XZWJraXQpe0M9ZnVuY3Rpb24oRyl7Rz0kKEcpO3ZhciBGPTAsSD0wO2Rve0YrPUcub2Zmc2V0VG9wfHwwO0grPUcub2Zmc2V0TGVmdHx8MDtpZihHLm9mZnNldFBhcmVudD09ZG9jdW1lbnQuYm9keSl7aWYoRWxlbWVudC5nZXRTdHlsZShHLCJwb3NpdGlvbiIpPT0iYWJzb2x1dGUiKXticmVha319Rz1HLm9mZnNldFBhcmVudH13aGlsZShHKTtyZXR1cm4gbmV3IEVsZW1lbnQuT2Zmc2V0KEgsRil9fX1FbGVtZW50LmFkZE1ldGhvZHMoe2dldExheW91dDp6LG1lYXN1cmU6ZCxnZXRXaWR0aDpjLGdldEhlaWdodDpxLGdldERpbWVuc2lvbnM6cyxnZXRPZmZzZXRQYXJlbnQ6cCxjdW11bGF0aXZlT2Zmc2V0OkMscG9zaXRpb25lZE9mZnNldDp3LGN1bXVsYXRpdmVTY3JvbGxPZmZzZXQ6Yix2aWV3cG9ydE9mZnNldDpBLGFic29sdXRpemU6eCxyZWxhdGl2aXplOmwsc2Nyb2xsVG86YSxtYWtlUG9zaXRpb25lZDp2LHVuZG9Qb3NpdGlvbmVkOnQsbWFrZUNsaXBwaW5nOmUsdW5kb0NsaXBwaW5nOkQsY2xvbmVQb3NpdGlvbjpFfSk7ZnVuY3Rpb24gbyhGKXtyZXR1cm4gRi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT09IkJPRFkifWZ1bmN0aW9uIG4oRil7cmV0dXJuIEYubm9kZU5hbWUudG9VcHBlckNhc2UoKT09PSJIVE1MIn1mdW5jdGlvbiBoKEYpe3JldHVybiBGLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFfWZ1bmN0aW9uIGYoRil7cmV0dXJuIEYhPT1kb2N1bWVudC5ib2R5JiYhRWxlbWVudC5kZXNjZW5kYW50T2YoRixkb2N1bWVudC5ib2R5KX1pZigiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpe0VsZW1lbnQuYWRkTWV0aG9kcyh7dmlld3BvcnRPZmZzZXQ6ZnVuY3Rpb24oRil7Rj0kKEYpO2lmKGYoRikpe3JldHVybiBuZXcgRWxlbWVudC5PZmZzZXQoMCwwKX12YXIgRz1GLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3JldHVybiBuZXcgRWxlbWVudC5PZmZzZXQoRy5sZWZ0LUguY2xpZW50TGVmdCxHLnRvcC1ILmNsaWVudFRvcCl9fSl9fSkoKTsoZnVuY3Rpb24oKXt2YXIgYz1Qcm90b3R5cGUuQnJvd3Nlci5PcGVyYSYmKHdpbmRvdy5wYXJzZUZsb2F0KHdpbmRvdy5vcGVyYS52ZXJzaW9uKCkpPDkuNSk7dmFyIGY9bnVsbDtmdW5jdGlvbiBiKCl7aWYoZil7cmV0dXJuIGZ9Zj1jP2RvY3VtZW50LmJvZHk6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3JldHVybiBmfWZ1bmN0aW9uIGQoKXtyZXR1cm57d2lkdGg6dGhpcy5nZXRXaWR0aCgpLGhlaWdodDp0aGlzLmdldEhlaWdodCgpfX1mdW5jdGlvbiBhKCl7cmV0dXJuIGIoKS5jbGllbnRXaWR0aH1mdW5jdGlvbiBnKCl7cmV0dXJuIGIoKS5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gZSgpe3ZhciBoPXdpbmRvdy5wYWdlWE9mZnNldHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDt2YXIgaT13aW5kb3cucGFnZVlPZmZzZXR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO3JldHVybiBuZXcgRWxlbWVudC5PZmZzZXQoaCxpKX1kb2N1bWVudC52aWV3cG9ydD17Z2V0RGltZW5zaW9uczpkLGdldFdpZHRoOmEsZ2V0SGVpZ2h0OmcsZ2V0U2Nyb2xsT2Zmc2V0czplfX0pKCk7d2luZG93LiQkPWZ1bmN0aW9uKCl7dmFyIGE9JEEoYXJndW1lbnRzKS5qb2luKCIsICIpO3JldHVybiBQcm90b3R5cGUuU2VsZWN0b3Iuc2VsZWN0KGEsZG9jdW1lbnQpfTtQcm90b3R5cGUuU2VsZWN0b3I9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3Rocm93IG5ldyBFcnJvcignTWV0aG9kICJQcm90b3R5cGUuU2VsZWN0b3Iuc2VsZWN0IiBtdXN0IGJlIGRlZmluZWQuJyl9ZnVuY3Rpb24gYygpe3Rocm93IG5ldyBFcnJvcignTWV0aG9kICJQcm90b3R5cGUuU2VsZWN0b3IubWF0Y2giIG11c3QgYmUgZGVmaW5lZC4nKX1mdW5jdGlvbiBkKGwsbSxoKXtoPWh8fDA7dmFyIGc9UHJvdG90eXBlLlNlbGVjdG9yLm1hdGNoLGs9bC5sZW5ndGgsZj0wLGo7Zm9yKGo9MDtqPGs7aisrKXtpZihnKGxbal0sbSkmJmg9PWYrKyl7cmV0dXJuIEVsZW1lbnQuZXh0ZW5kKGxbal0pfX19ZnVuY3Rpb24gZShoKXtmb3IodmFyIGY9MCxnPWgubGVuZ3RoO2Y8ZztmKyspe0VsZW1lbnQuZXh0ZW5kKGhbZl0pfXJldHVybiBofXZhciBiPVByb3RvdHlwZS5LO3JldHVybntzZWxlY3Q6YSxtYXRjaDpjLGZpbmQ6ZCxleHRlbmRFbGVtZW50czooRWxlbWVudC5leHRlbmQ9PT1iKT9iOmUsZXh0ZW5kRWxlbWVudDpFbGVtZW50LmV4dGVuZH19KSgpO1Byb3RvdHlwZS5fb3JpZ2luYWxfcHJvcGVydHk9d2luZG93LlNpenpsZTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe1Byb3RvdHlwZS5fYWN0dWFsX3NpenpsZT1iKCl9YS5hbWQ9dHJ1ZTtpZih0eXBlb2YgZGVmaW5lIT09InVuZGVmaW5lZCImJmRlZmluZS5hbWQpe1Byb3RvdHlwZS5fb3JpZ2luYWxfZGVmaW5lPWRlZmluZTtQcm90b3R5cGUuX2FjdHVhbF9zaXp6bGU9bnVsbDt3aW5kb3cuZGVmaW5lPWF9fSkoKTsKLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYxLjEwLjE4CiAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCAyMDEzIGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxNC0wMi0wNQogKi8KKGZ1bmN0aW9uKGF2KXt2YXIgRCxheSx0LE0sUCxhYixheCxhQyxOLGFjLGFlLEgsdSxhbixhaSxhdyxrLEssYXA9InNpenpsZSIrLShuZXcgRGF0ZSgpKSxPPWF2LmRvY3VtZW50LGF6PTAsYWo9MCxkPUYoKSxhbz1GKCksTD1GKCksSj1mdW5jdGlvbihpLGUpe2lmKGk9PT1lKXthYz10cnVlfXJldHVybiAwfSxhdT10eXBlb2YgdW5kZWZpbmVkLFY9MTw8MzEsVD0oe30pLmhhc093blByb3BlcnR5LGFyPVtdLGF0PWFyLnBvcCxSPWFyLnB1c2gsYj1hci5wdXNoLHM9YXIuc2xpY2Usaj1hci5pbmRleE9mfHxmdW5jdGlvbihhRSl7dmFyIGFEPTAsZT10aGlzLmxlbmd0aDtmb3IoO2FEPGU7YUQrKyl7aWYodGhpc1thRF09PT1hRSl7cmV0dXJuIGFEfX1yZXR1cm4gLTF9LGM9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIix2PSJbXFx4MjBcXHRcXHJcXG5cXGZdIixhPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsUT1hLnJlcGxhY2UoInciLCJ3IyIpLGFsPSJcXFsiK3YrIiooIithKyIpIit2KyIqKD86KFsqXiR8IX5dPz0pIit2KyIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIitRKyIpfCl8KSIrdisiKlxcXSIscT0iOigiK2ErIikoPzpcXCgoKFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woKD86XFxcXC58W15cXFxcKClbXFxdXXwiK2FsLnJlcGxhY2UoMyw4KSsiKSopfC4qKVxcKXwpIix4PW5ldyBSZWdFeHAoIl4iK3YrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrdisiKyQiLCJnIiksQT1uZXcgUmVnRXhwKCJeIit2KyIqLCIrdisiKiIpLEc9bmV3IFJlZ0V4cCgiXiIrdisiKihbPit+XXwiK3YrIikiK3YrIioiKSx6PW5ldyBSZWdFeHAoIj0iK3YrIiooW15cXF0nXCJdKj8pIit2KyIqXFxdIiwiZyIpLFg9bmV3IFJlZ0V4cChxKSxaPW5ldyBSZWdFeHAoIl4iK1ErIiQiKSxhaD17SUQ6bmV3IFJlZ0V4cCgiXiMoIithKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK2ErIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK2EucmVwbGFjZSgidyIsIncqIikrIikiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK2FsKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrcSksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIit2KyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIit2KyIqKD86KFsrLV18KSIrdisiKihcXGQrKXwpKSIrdisiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrYysiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK3YrIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrdisiKigoPzotXFxkKT9cXGQqKSIrdisiKlxcKXwpKD89W14tXXwkKSIsImkiKX0saD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHI9L15oXGQkL2ksVT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sVz0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLGFnPS9bK35dLyxTPS8nfFxcL2cseT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK3YrIj98KCIrdisiKXwuKSIsImlnIiksYWs9ZnVuY3Rpb24oZSxhRSxpKXt2YXIgYUQ9IjB4IithRS02NTUzNjtyZXR1cm4gYUQhPT1hRHx8aT9hRTphRDwwP1N0cmluZy5mcm9tQ2hhckNvZGUoYUQrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUoYUQ+PjEwfDU1Mjk2LGFEJjEwMjN8NTYzMjApfTt0cnl7Yi5hcHBseSgoYXI9cy5jYWxsKE8uY2hpbGROb2RlcykpLE8uY2hpbGROb2Rlcyk7YXJbTy5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goSSl7Yj17YXBwbHk6YXIubGVuZ3RoP2Z1bmN0aW9uKGksZSl7Ui5hcHBseShpLHMuY2FsbChlKSl9OmZ1bmN0aW9uKGFGLGFFKXt2YXIgZT1hRi5sZW5ndGgsYUQ9MDt3aGlsZSgoYUZbZSsrXT1hRVthRCsrXSkpe31hRi5sZW5ndGg9ZS0xfX19ZnVuY3Rpb24gQihhSyxhRCxhTyxhUSl7dmFyIGFQLGFILGFJLGFNLGFOLGFHLGFGLGUsYUUsYUw7aWYoKGFEP2FELm93bmVyRG9jdW1lbnR8fGFEOk8pIT09SCl7YWUoYUQpfWFEPWFEfHxIO2FPPWFPfHxbXTtpZighYUt8fHR5cGVvZiBhSyE9PSJzdHJpbmciKXtyZXR1cm4gYU99aWYoKGFNPWFELm5vZGVUeXBlKSE9PTEmJmFNIT09OSl7cmV0dXJuW119aWYoYW4mJiFhUSl7aWYoKGFQPVcuZXhlYyhhSykpKXtpZigoYUk9YVBbMV0pKXtpZihhTT09PTkpe2FIPWFELmdldEVsZW1lbnRCeUlkKGFJKTtpZihhSCYmYUgucGFyZW50Tm9kZSl7aWYoYUguaWQ9PT1hSSl7YU8ucHVzaChhSCk7cmV0dXJuIGFPfX1lbHNle3JldHVybiBhT319ZWxzZXtpZihhRC5vd25lckRvY3VtZW50JiYoYUg9YUQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChhSSkpJiZLKGFELGFIKSYmYUguaWQ9PT1hSSl7YU8ucHVzaChhSCk7cmV0dXJuIGFPfX19ZWxzZXtpZihhUFsyXSl7Yi5hcHBseShhTyxhRC5nZXRFbGVtZW50c0J5VGFnTmFtZShhSykpO3JldHVybiBhT31lbHNle2lmKChhST1hUFszXSkmJmF5LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmFELmdldEVsZW1lbnRzQnlDbGFzc05hbWUpe2IuYXBwbHkoYU8sYUQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhSSkpO3JldHVybiBhT319fX1pZihheS5xc2EmJighYWl8fCFhaS50ZXN0KGFLKSkpe2U9YUY9YXA7YUU9YUQ7YUw9YU09PT05JiZhSztpZihhTT09PTEmJmFELm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0ib2JqZWN0Iil7YUc9bihhSyk7aWYoKGFGPWFELmdldEF0dHJpYnV0ZSgiaWQiKSkpe2U9YUYucmVwbGFjZShTLCJcXCQmIil9ZWxzZXthRC5zZXRBdHRyaWJ1dGUoImlkIixlKX1lPSJbaWQ9JyIrZSsiJ10gIjthTj1hRy5sZW5ndGg7d2hpbGUoYU4tLSl7YUdbYU5dPWUrbyhhR1thTl0pfWFFPWFnLnRlc3QoYUspJiZZKGFELnBhcmVudE5vZGUpfHxhRDthTD1hRy5qb2luKCIsIil9aWYoYUwpe3RyeXtiLmFwcGx5KGFPLGFFLnF1ZXJ5U2VsZWN0b3JBbGwoYUwpKTtyZXR1cm4gYU99Y2F0Y2goYUope31maW5hbGx5e2lmKCFhRil7YUQucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19fX1yZXR1cm4gYXgoYUsucmVwbGFjZSh4LCIkMSIpLGFELGFPLGFRKX1mdW5jdGlvbiBGKCl7dmFyIGk9W107ZnVuY3Rpb24gZShhRCxhRSl7aWYoaS5wdXNoKGFEKyIgIik+dC5jYWNoZUxlbmd0aCl7ZGVsZXRlIGVbaS5zaGlmdCgpXX1yZXR1cm4oZVthRCsiICJdPWFFKX1yZXR1cm4gZX1mdW5jdGlvbiBwKGUpe2VbYXBdPXRydWU7cmV0dXJuIGV9ZnVuY3Rpb24gbChpKXt2YXIgYUU9SC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0cnl7cmV0dXJuICEhaShhRSl9Y2F0Y2goYUQpe3JldHVybiBmYWxzZX1maW5hbGx5e2lmKGFFLnBhcmVudE5vZGUpe2FFLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYUUpfWFFPW51bGx9fWZ1bmN0aW9uIGFBKGFELGFGKXt2YXIgZT1hRC5zcGxpdCgifCIpLGFFPWFELmxlbmd0aDt3aGlsZShhRS0tKXt0LmF0dHJIYW5kbGVbZVthRV1dPWFGfX1mdW5jdGlvbiBmKGksZSl7dmFyIGFFPWUmJmksYUQ9YUUmJmkubm9kZVR5cGU9PT0xJiZlLm5vZGVUeXBlPT09MSYmKH5lLnNvdXJjZUluZGV4fHxWKS0ofmkuc291cmNlSW5kZXh8fFYpO2lmKGFEKXtyZXR1cm4gYUR9aWYoYUUpe3doaWxlKChhRT1hRS5uZXh0U2libGluZykpe2lmKGFFPT09ZSl7cmV0dXJuIC0xfX19cmV0dXJuIGk/MTotMX1mdW5jdGlvbiBDKGUpe3JldHVybiBmdW5jdGlvbihhRCl7dmFyIGk9YUQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gaT09PSJpbnB1dCImJmFELnR5cGU9PT1lfX1mdW5jdGlvbiBnKGUpe3JldHVybiBmdW5jdGlvbihhRCl7dmFyIGk9YUQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oaT09PSJpbnB1dCJ8fGk9PT0iYnV0dG9uIikmJmFELnR5cGU9PT1lfX1mdW5jdGlvbiBhbShlKXtyZXR1cm4gcChmdW5jdGlvbihpKXtpPStpO3JldHVybiBwKGZ1bmN0aW9uKGFELGFIKXt2YXIgYUYsYUU9ZShbXSxhRC5sZW5ndGgsaSksYUc9YUUubGVuZ3RoO3doaWxlKGFHLS0pe2lmKGFEWyhhRj1hRVthR10pXSl7YURbYUZdPSEoYUhbYUZdPWFEW2FGXSl9fX0pfSl9ZnVuY3Rpb24gWShlKXtyZXR1cm4gZSYmdHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1hdSYmZX1heT1CLnN1cHBvcnQ9e307UD1CLmlzWE1MPWZ1bmN0aW9uKGUpe3ZhciBpPWUmJihlLm93bmVyRG9jdW1lbnR8fGUpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gaT9pLm5vZGVOYW1lIT09IkhUTUwiOmZhbHNlfTthZT1CLnNldERvY3VtZW50PWZ1bmN0aW9uKGFEKXt2YXIgZSxhRT1hRD9hRC5vd25lckRvY3VtZW50fHxhRDpPLGk9YUUuZGVmYXVsdFZpZXc7aWYoYUU9PT1IfHxhRS5ub2RlVHlwZSE9PTl8fCFhRS5kb2N1bWVudEVsZW1lbnQpe3JldHVybiBIfUg9YUU7dT1hRS5kb2N1bWVudEVsZW1lbnQ7YW49IVAoYUUpO2lmKGkmJmkhPT1pLnRvcCl7aWYoaS5hZGRFdmVudExpc3RlbmVyKXtpLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXthZSgpfSxmYWxzZSl9ZWxzZXtpZihpLmF0dGFjaEV2ZW50KXtpLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsZnVuY3Rpb24oKXthZSgpfSl9fX1heS5hdHRyaWJ1dGVzPWwoZnVuY3Rpb24oYUYpe2FGLmNsYXNzTmFtZT0iaSI7cmV0dXJuICFhRi5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSk7YXkuZ2V0RWxlbWVudHNCeVRhZ05hbWU9bChmdW5jdGlvbihhRil7YUYuYXBwZW5kQ2hpbGQoYUUuY3JlYXRlQ29tbWVudCgiIikpO3JldHVybiAhYUYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KTtheS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVUudGVzdChhRS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSYmbChmdW5jdGlvbihhRil7YUYuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdhJz48L2Rpdj48ZGl2IGNsYXNzPSdhIGknPjwvZGl2PiI7YUYuZmlyc3RDaGlsZC5jbGFzc05hbWU9ImkiO3JldHVybiBhRi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpIikubGVuZ3RoPT09Mn0pO2F5LmdldEJ5SWQ9bChmdW5jdGlvbihhRil7dS5hcHBlbmRDaGlsZChhRikuaWQ9YXA7cmV0dXJuICFhRS5nZXRFbGVtZW50c0J5TmFtZXx8IWFFLmdldEVsZW1lbnRzQnlOYW1lKGFwKS5sZW5ndGh9KTtpZihheS5nZXRCeUlkKXt0LmZpbmQuSUQ9ZnVuY3Rpb24oYUgsYUcpe2lmKHR5cGVvZiBhRy5nZXRFbGVtZW50QnlJZCE9PWF1JiZhbil7dmFyIGFGPWFHLmdldEVsZW1lbnRCeUlkKGFIKTtyZXR1cm4gYUYmJmFGLnBhcmVudE5vZGU/W2FGXTpbXX19O3QuZmlsdGVyLklEPWZ1bmN0aW9uKGFHKXt2YXIgYUY9YUcucmVwbGFjZSh5LGFrKTtyZXR1cm4gZnVuY3Rpb24oYUgpe3JldHVybiBhSC5nZXRBdHRyaWJ1dGUoImlkIik9PT1hRn19fWVsc2V7ZGVsZXRlIHQuZmluZC5JRDt0LmZpbHRlci5JRD1mdW5jdGlvbihhRyl7dmFyIGFGPWFHLnJlcGxhY2UoeSxhayk7cmV0dXJuIGZ1bmN0aW9uKGFJKXt2YXIgYUg9dHlwZW9mIGFJLmdldEF0dHJpYnV0ZU5vZGUhPT1hdSYmYUkuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYUgmJmFILnZhbHVlPT09YUZ9fX10LmZpbmQuVEFHPWF5LmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGFGLGFHKXtpZih0eXBlb2YgYUcuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1hdSl7cmV0dXJuIGFHLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFGKX19OmZ1bmN0aW9uKGFGLGFKKXt2YXIgYUssYUk9W10sYUg9MCxhRz1hSi5nZXRFbGVtZW50c0J5VGFnTmFtZShhRik7aWYoYUY9PT0iKiIpe3doaWxlKChhSz1hR1thSCsrXSkpe2lmKGFLLm5vZGVUeXBlPT09MSl7YUkucHVzaChhSyl9fXJldHVybiBhSX1yZXR1cm4gYUd9O3QuZmluZC5DTEFTUz1heS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihhRyxhRil7aWYodHlwZW9mIGFGLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPT1hdSYmYW4pe3JldHVybiBhRi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFHKX19O2F3PVtdO2FpPVtdO2lmKChheS5xc2E9VS50ZXN0KGFFLnF1ZXJ5U2VsZWN0b3JBbGwpKSl7bChmdW5jdGlvbihhRil7YUYuaW5uZXJIVE1MPSI8c2VsZWN0IHQ9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iO2lmKGFGLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0Xj0nJ10iKS5sZW5ndGgpe2FpLnB1c2goIlsqXiRdPSIrdisiKig/OicnfFwiXCIpIil9aWYoIWFGLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGgpe2FpLnB1c2goIlxcWyIrdisiKig/OnZhbHVlfCIrYysiKSIpfWlmKCFhRi5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aCl7YWkucHVzaCgiOmNoZWNrZWQiKX19KTtsKGZ1bmN0aW9uKGFHKXt2YXIgYUY9YUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTthRi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKTthRy5hcHBlbmRDaGlsZChhRikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpO2lmKGFHLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoKXthaS5wdXNoKCJuYW1lIit2KyIqWypeJHwhfl0/PSIpfWlmKCFhRy5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCl7YWkucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKX1hRy5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iik7YWkucHVzaCgiLC4qOiIpfSl9aWYoKGF5Lm1hdGNoZXNTZWxlY3Rvcj1VLnRlc3QoKGs9dS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fHUubW96TWF0Y2hlc1NlbGVjdG9yfHx1Lm9NYXRjaGVzU2VsZWN0b3J8fHUubXNNYXRjaGVzU2VsZWN0b3IpKSkpe2woZnVuY3Rpb24oYUYpe2F5LmRpc2Nvbm5lY3RlZE1hdGNoPWsuY2FsbChhRiwiZGl2Iik7ay5jYWxsKGFGLCJbcyE9JyddOngiKTthdy5wdXNoKCIhPSIscSl9KX1haT1haS5sZW5ndGgmJm5ldyBSZWdFeHAoYWkuam9pbigifCIpKTthdz1hdy5sZW5ndGgmJm5ldyBSZWdFeHAoYXcuam9pbigifCIpKTtlPVUudGVzdCh1LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKTtLPWV8fFUudGVzdCh1LmNvbnRhaW5zKT9mdW5jdGlvbihhRyxhRil7dmFyIGFJPWFHLm5vZGVUeXBlPT09OT9hRy5kb2N1bWVudEVsZW1lbnQ6YUcsYUg9YUYmJmFGLnBhcmVudE5vZGU7cmV0dXJuIGFHPT09YUh8fCEhKGFIJiZhSC5ub2RlVHlwZT09PTEmJihhSS5jb250YWlucz9hSS5jb250YWlucyhhSCk6YUcuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJmFHLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGFIKSYxNikpfTpmdW5jdGlvbihhRyxhRil7aWYoYUYpe3doaWxlKChhRj1hRi5wYXJlbnROb2RlKSl7aWYoYUY9PT1hRyl7cmV0dXJuIHRydWV9fX1yZXR1cm4gZmFsc2V9O0o9ZT9mdW5jdGlvbihhRyxhRil7aWYoYUc9PT1hRil7YWM9dHJ1ZTtyZXR1cm4gMH12YXIgYUg9IWFHLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFhRi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtpZihhSCl7cmV0dXJuIGFIfWFIPShhRy5vd25lckRvY3VtZW50fHxhRyk9PT0oYUYub3duZXJEb2N1bWVudHx8YUYpP2FHLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGFGKToxO2lmKGFIJjF8fCghYXkuc29ydERldGFjaGVkJiZhRi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhRyk9PT1hSCkpe2lmKGFHPT09YUV8fGFHLm93bmVyRG9jdW1lbnQ9PT1PJiZLKE8sYUcpKXtyZXR1cm4gLTF9aWYoYUY9PT1hRXx8YUYub3duZXJEb2N1bWVudD09PU8mJksoTyxhRikpe3JldHVybiAxfXJldHVybiBOPyhqLmNhbGwoTixhRyktai5jYWxsKE4sYUYpKTowfXJldHVybiBhSCY0Py0xOjF9OmZ1bmN0aW9uKGFHLGFGKXtpZihhRz09PWFGKXthYz10cnVlO3JldHVybiAwfXZhciBhTSxhSj0wLGFMPWFHLnBhcmVudE5vZGUsYUk9YUYucGFyZW50Tm9kZSxhSD1bYUddLGFLPVthRl07aWYoIWFMfHwhYUkpe3JldHVybiBhRz09PWFFPy0xOmFGPT09YUU/MTphTD8tMTphST8xOk4/KGouY2FsbChOLGFHKS1qLmNhbGwoTixhRikpOjB9ZWxzZXtpZihhTD09PWFJKXtyZXR1cm4gZihhRyxhRil9fWFNPWFHO3doaWxlKChhTT1hTS5wYXJlbnROb2RlKSl7YUgudW5zaGlmdChhTSl9YU09YUY7d2hpbGUoKGFNPWFNLnBhcmVudE5vZGUpKXthSy51bnNoaWZ0KGFNKX13aGlsZShhSFthSl09PT1hS1thSl0pe2FKKyt9cmV0dXJuIGFKP2YoYUhbYUpdLGFLW2FKXSk6YUhbYUpdPT09Tz8tMTphS1thSl09PT1PPzE6MH07cmV0dXJuIGFFfTtCLm1hdGNoZXM9ZnVuY3Rpb24oaSxlKXtyZXR1cm4gQihpLG51bGwsbnVsbCxlKX07Qi5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYUQsYUYpe2lmKChhRC5vd25lckRvY3VtZW50fHxhRCkhPT1IKXthZShhRCl9YUY9YUYucmVwbGFjZSh6LCI9JyQxJ10iKTtpZihheS5tYXRjaGVzU2VsZWN0b3ImJmFuJiYoIWF3fHwhYXcudGVzdChhRikpJiYoIWFpfHwhYWkudGVzdChhRikpKXt0cnl7dmFyIGk9ay5jYWxsKGFELGFGKTtpZihpfHxheS5kaXNjb25uZWN0ZWRNYXRjaHx8YUQuZG9jdW1lbnQmJmFELmRvY3VtZW50Lm5vZGVUeXBlIT09MTEpe3JldHVybiBpfX1jYXRjaChhRSl7fX1yZXR1cm4gQihhRixILG51bGwsW2FEXSkubGVuZ3RoPjB9O0IuY29udGFpbnM9ZnVuY3Rpb24oZSxpKXtpZigoZS5vd25lckRvY3VtZW50fHxlKSE9PUgpe2FlKGUpfXJldHVybiBLKGUsaSl9O0IuYXR0cj1mdW5jdGlvbihhRCxlKXtpZigoYUQub3duZXJEb2N1bWVudHx8YUQpIT09SCl7YWUoYUQpfXZhciBpPXQuYXR0ckhhbmRsZVtlLnRvTG93ZXJDYXNlKCldLGFFPWkmJlQuY2FsbCh0LmF0dHJIYW5kbGUsZS50b0xvd2VyQ2FzZSgpKT9pKGFELGUsIWFuKTp1bmRlZmluZWQ7cmV0dXJuIGFFIT09dW5kZWZpbmVkP2FFOmF5LmF0dHJpYnV0ZXN8fCFhbj9hRC5nZXRBdHRyaWJ1dGUoZSk6KGFFPWFELmdldEF0dHJpYnV0ZU5vZGUoZSkpJiZhRS5zcGVjaWZpZWQ/YUUudmFsdWU6bnVsbH07Qi5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9O0IudW5pcXVlU29ydD1mdW5jdGlvbihhRSl7dmFyIGFGLGFHPVtdLGU9MCxhRD0wO2FjPSFheS5kZXRlY3REdXBsaWNhdGVzO049IWF5LnNvcnRTdGFibGUmJmFFLnNsaWNlKDApO2FFLnNvcnQoSik7aWYoYWMpe3doaWxlKChhRj1hRVthRCsrXSkpe2lmKGFGPT09YUVbYURdKXtlPWFHLnB1c2goYUQpfX13aGlsZShlLS0pe2FFLnNwbGljZShhR1tlXSwxKX19Tj1udWxsO3JldHVybiBhRX07TT1CLmdldFRleHQ9ZnVuY3Rpb24oYUcpe3ZhciBhRixhRD0iIixhRT0wLGU9YUcubm9kZVR5cGU7aWYoIWUpe3doaWxlKChhRj1hR1thRSsrXSkpe2FEKz1NKGFGKX19ZWxzZXtpZihlPT09MXx8ZT09PTl8fGU9PT0xMSl7aWYodHlwZW9mIGFHLnRleHRDb250ZW50PT09InN0cmluZyIpe3JldHVybiBhRy50ZXh0Q29udGVudH1lbHNle2ZvcihhRz1hRy5maXJzdENoaWxkO2FHO2FHPWFHLm5leHRTaWJsaW5nKXthRCs9TShhRyl9fX1lbHNle2lmKGU9PT0zfHxlPT09NCl7cmV0dXJuIGFHLm5vZGVWYWx1ZX19fXJldHVybiBhRH07dD1CLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOnAsbWF0Y2g6YWgsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6dHJ1ZX0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDp0cnVlfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihlKXtlWzFdPWVbMV0ucmVwbGFjZSh5LGFrKTtlWzNdPShlWzRdfHxlWzVdfHwiIikucmVwbGFjZSh5LGFrKTtpZihlWzJdPT09In49Iil7ZVszXT0iICIrZVszXSsiICJ9cmV0dXJuIGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7ZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCk7aWYoZVsxXS5zbGljZSgwLDMpPT09Im50aCIpe2lmKCFlWzNdKXtCLmVycm9yKGVbMF0pfWVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKGVbM109PT0iZXZlbiJ8fGVbM109PT0ib2RkIikpO2VbNV09KygoZVs3XStlWzhdKXx8ZVszXT09PSJvZGQiKX1lbHNle2lmKGVbM10pe0IuZXJyb3IoZVswXSl9fXJldHVybiBlfSxQU0VVRE86ZnVuY3Rpb24oaSl7dmFyIGUsYUQ9IWlbNV0mJmlbMl07aWYoYWguQ0hJTEQudGVzdChpWzBdKSl7cmV0dXJuIG51bGx9aWYoaVszXSYmaVs0XSE9PXVuZGVmaW5lZCl7aVsyXT1pWzRdfWVsc2V7aWYoYUQmJlgudGVzdChhRCkmJihlPW4oYUQsdHJ1ZSkpJiYoZT1hRC5pbmRleE9mKCIpIixhRC5sZW5ndGgtZSktYUQubGVuZ3RoKSl7aVswXT1pWzBdLnNsaWNlKDAsZSk7aVsyXT1hRC5zbGljZSgwLGUpfX1yZXR1cm4gaS5zbGljZSgwLDMpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oaSl7dmFyIGU9aS5yZXBsYWNlKHksYWspLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGk9PT0iKiI/ZnVuY3Rpb24oKXtyZXR1cm4gdHJ1ZX06ZnVuY3Rpb24oYUQpe3JldHVybiBhRC5ub2RlTmFtZSYmYUQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWV9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgaT1kW2UrIiAiXTtyZXR1cm4gaXx8KGk9bmV3IFJlZ0V4cCgiKF58Iit2KyIpIitlKyIoIit2KyJ8JCkiKSkmJmQoZSxmdW5jdGlvbihhRCl7cmV0dXJuIGkudGVzdCh0eXBlb2YgYUQuY2xhc3NOYW1lPT09InN0cmluZyImJmFELmNsYXNzTmFtZXx8dHlwZW9mIGFELmdldEF0dHJpYnV0ZSE9PWF1JiZhRC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGFELGksZSl7cmV0dXJuIGZ1bmN0aW9uKGFGKXt2YXIgYUU9Qi5hdHRyKGFGLGFEKTtpZihhRT09bnVsbCl7cmV0dXJuIGk9PT0iIT0ifWlmKCFpKXtyZXR1cm4gdHJ1ZX1hRSs9IiI7cmV0dXJuIGk9PT0iPSI/YUU9PT1lOmk9PT0iIT0iP2FFIT09ZTppPT09Il49Ij9lJiZhRS5pbmRleE9mKGUpPT09MDppPT09Iio9Ij9lJiZhRS5pbmRleE9mKGUpPi0xOmk9PT0iJD0iP2UmJmFFLnNsaWNlKC1lLmxlbmd0aCk9PT1lOmk9PT0ifj0iPygiICIrYUUrIiAiKS5pbmRleE9mKGUpPi0xOmk9PT0ifD0iP2FFPT09ZXx8YUUuc2xpY2UoMCxlLmxlbmd0aCsxKT09PWUrIi0iOmZhbHNlfX0sQ0hJTEQ6ZnVuY3Rpb24oaSxhRixhRSxhRyxhRCl7dmFyIGFJPWkuc2xpY2UoMCwzKSE9PSJudGgiLGU9aS5zbGljZSgtNCkhPT0ibGFzdCIsYUg9YUY9PT0ib2YtdHlwZSI7cmV0dXJuIGFHPT09MSYmYUQ9PT0wP2Z1bmN0aW9uKGFKKXtyZXR1cm4gISFhSi5wYXJlbnROb2RlfTpmdW5jdGlvbihhUCxhTixhUyl7dmFyIGFKLGFWLGFRLGFVLGFSLGFNLGFPPWFJIT09ZT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLGFUPWFQLnBhcmVudE5vZGUsYUw9YUgmJmFQLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksYUs9IWFTJiYhYUg7aWYoYVQpe2lmKGFJKXt3aGlsZShhTyl7YVE9YVA7d2hpbGUoKGFRPWFRW2FPXSkpe2lmKGFIP2FRLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1hTDphUS5ub2RlVHlwZT09PTEpe3JldHVybiBmYWxzZX19YU09YU89aT09PSJvbmx5IiYmIWFNJiYibmV4dFNpYmxpbmcifXJldHVybiB0cnVlfWFNPVtlP2FULmZpcnN0Q2hpbGQ6YVQubGFzdENoaWxkXTtpZihlJiZhSyl7YVY9YVRbYXBdfHwoYVRbYXBdPXt9KTthSj1hVltpXXx8W107YVI9YUpbMF09PT1heiYmYUpbMV07YVU9YUpbMF09PT1heiYmYUpbMl07YVE9YVImJmFULmNoaWxkTm9kZXNbYVJdO3doaWxlKChhUT0rK2FSJiZhUSYmYVFbYU9dfHwoYVU9YVI9MCl8fGFNLnBvcCgpKSl7aWYoYVEubm9kZVR5cGU9PT0xJiYrK2FVJiZhUT09PWFQKXthVltpXT1bYXosYVIsYVVdO2JyZWFrfX19ZWxzZXtpZihhSyYmKGFKPShhUFthcF18fChhUFthcF09e30pKVtpXSkmJmFKWzBdPT09YXope2FVPWFKWzFdfWVsc2V7d2hpbGUoKGFRPSsrYVImJmFRJiZhUVthT118fChhVT1hUj0wKXx8YU0ucG9wKCkpKXtpZigoYUg/YVEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWFMOmFRLm5vZGVUeXBlPT09MSkmJisrYVUpe2lmKGFLKXsoYVFbYXBdfHwoYVFbYXBdPXt9KSlbaV09W2F6LGFVXX1pZihhUT09PWFQKXticmVha319fX19YVUtPWFEO3JldHVybiBhVT09PWFHfHwoYVUlYUc9PT0wJiZhVS9hRz49MCl9fX0sUFNFVURPOmZ1bmN0aW9uKGFFLGFEKXt2YXIgZSxpPXQucHNldWRvc1thRV18fHQuc2V0RmlsdGVyc1thRS50b0xvd2VyQ2FzZSgpXXx8Qi5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2FFKTtpZihpW2FwXSl7cmV0dXJuIGkoYUQpfWlmKGkubGVuZ3RoPjEpe2U9W2FFLGFFLCIiLGFEXTtyZXR1cm4gdC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGFFLnRvTG93ZXJDYXNlKCkpP3AoZnVuY3Rpb24oYUgsYUope3ZhciBhRyxhRj1pKGFILGFEKSxhST1hRi5sZW5ndGg7d2hpbGUoYUktLSl7YUc9ai5jYWxsKGFILGFGW2FJXSk7YUhbYUddPSEoYUpbYUddPWFGW2FJXSl9fSk6ZnVuY3Rpb24oYUYpe3JldHVybiBpKGFGLDAsZSl9fXJldHVybiBpfX0scHNldWRvczp7bm90OnAoZnVuY3Rpb24oZSl7dmFyIGk9W10sYUQ9W10sYUU9YWIoZS5yZXBsYWNlKHgsIiQxIikpO3JldHVybiBhRVthcF0/cChmdW5jdGlvbihhRyxhTCxhSixhSCl7dmFyIGFLLGFGPWFFKGFHLG51bGwsYUgsW10pLGFJPWFHLmxlbmd0aDt3aGlsZShhSS0tKXtpZigoYUs9YUZbYUldKSl7YUdbYUldPSEoYUxbYUldPWFLKX19fSk6ZnVuY3Rpb24oYUgsYUcsYUYpe2lbMF09YUg7YUUoaSxudWxsLGFGLGFEKTtyZXR1cm4gIWFELnBvcCgpfX0pLGhhczpwKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihpKXtyZXR1cm4gQihlLGkpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOnAoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybihpLnRleHRDb250ZW50fHxpLmlubmVyVGV4dHx8TShpKSkuaW5kZXhPZihlKT4tMX19KSxsYW5nOnAoZnVuY3Rpb24oZSl7aWYoIVoudGVzdChlfHwiIikpe0IuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrZSl9ZT1lLnJlcGxhY2UoeSxhaykudG9Mb3dlckNhc2UoKTtyZXR1cm4gZnVuY3Rpb24oYUQpe3ZhciBpO2Rve2lmKChpPWFuP2FELmxhbmc6YUQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxhRC5nZXRBdHRyaWJ1dGUoImxhbmciKSkpe2k9aS50b0xvd2VyQ2FzZSgpO3JldHVybiBpPT09ZXx8aS5pbmRleE9mKGUrIi0iKT09PTB9fXdoaWxlKChhRD1hRC5wYXJlbnROb2RlKSYmYUQubm9kZVR5cGU9PT0xKTtyZXR1cm4gZmFsc2V9fSksdGFyZ2V0OmZ1bmN0aW9uKGUpe3ZhciBpPWF2LmxvY2F0aW9uJiZhdi5sb2NhdGlvbi5oYXNoO3JldHVybiBpJiZpLnNsaWNlKDEpPT09ZS5pZH0scm9vdDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PXV9LGZvY3VzOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09SC5hY3RpdmVFbGVtZW50JiYoIUguaGFzRm9jdXN8fEguaGFzRm9jdXMoKSkmJiEhKGUudHlwZXx8ZS5ocmVmfHx+ZS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQ9PT1mYWxzZX0sZGlzYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQ9PT10cnVlfSxjaGVja2VkOmZ1bmN0aW9uKGUpe3ZhciBpPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oaT09PSJpbnB1dCImJiEhZS5jaGVja2VkKXx8KGk9PT0ib3B0aW9uIiYmISFlLnNlbGVjdGVkKX0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7aWYoZS5wYXJlbnROb2RlKXtlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleH1yZXR1cm4gZS5zZWxlY3RlZD09PXRydWV9LGVtcHR5OmZ1bmN0aW9uKGUpe2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyl7aWYoZS5ub2RlVHlwZTw2KXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuICF0LnBzZXVkb3MuZW1wdHkoZSl9LGhlYWRlcjpmdW5jdGlvbihlKXtyZXR1cm4gci50ZXN0KGUubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gaC50ZXN0KGUubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oaSl7dmFyIGU9aS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBlPT09ImlucHV0IiYmaS50eXBlPT09ImJ1dHRvbiJ8fGU9PT0iYnV0dG9uIn0sdGV4dDpmdW5jdGlvbihpKXt2YXIgZTtyZXR1cm4gaS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmaS50eXBlPT09InRleHQiJiYoKGU9aS5nZXRBdHRyaWJ1dGUoInR5cGUiKSk9PW51bGx8fGUudG9Mb3dlckNhc2UoKT09PSJ0ZXh0Iil9LGZpcnN0OmFtKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDphbShmdW5jdGlvbihlLGkpe3JldHVybltpLTFdfSksZXE6YW0oZnVuY3Rpb24oZSxhRCxpKXtyZXR1cm5baTwwP2krYUQ6aV19KSxldmVuOmFtKGZ1bmN0aW9uKGUsYUUpe3ZhciBhRD0wO2Zvcig7YUQ8YUU7YUQrPTIpe2UucHVzaChhRCl9cmV0dXJuIGV9KSxvZGQ6YW0oZnVuY3Rpb24oZSxhRSl7dmFyIGFEPTE7Zm9yKDthRDxhRTthRCs9Mil7ZS5wdXNoKGFEKX1yZXR1cm4gZX0pLGx0OmFtKGZ1bmN0aW9uKGUsYUYsYUUpe3ZhciBhRD1hRTwwP2FFK2FGOmFFO2Zvcig7LS1hRD49MDspe2UucHVzaChhRCl9cmV0dXJuIGV9KSxndDphbShmdW5jdGlvbihlLGFGLGFFKXt2YXIgYUQ9YUU8MD9hRSthRjphRTtmb3IoOysrYUQ8YUY7KXtlLnB1c2goYUQpfXJldHVybiBlfSl9fTt0LnBzZXVkb3MubnRoPXQucHNldWRvcy5lcTtmb3IoRCBpbiB7cmFkaW86dHJ1ZSxjaGVja2JveDp0cnVlLGZpbGU6dHJ1ZSxwYXNzd29yZDp0cnVlLGltYWdlOnRydWV9KXt0LnBzZXVkb3NbRF09QyhEKX1mb3IoRCBpbiB7c3VibWl0OnRydWUscmVzZXQ6dHJ1ZX0pe3QucHNldWRvc1tEXT1nKEQpfWZ1bmN0aW9uIGFhKCl7fWFhLnByb3RvdHlwZT10LmZpbHRlcnM9dC5wc2V1ZG9zO3Quc2V0RmlsdGVycz1uZXcgYWEoKTtmdW5jdGlvbiBuKGFGLGFLKXt2YXIgaSxhRyxhSSxhSixhSCxhRCxlLGFFPWFvW2FGKyIgIl07aWYoYUUpe3JldHVybiBhSz8wOmFFLnNsaWNlKDApfWFIPWFGO2FEPVtdO2U9dC5wcmVGaWx0ZXI7d2hpbGUoYUgpe2lmKCFpfHwoYUc9QS5leGVjKGFIKSkpe2lmKGFHKXthSD1hSC5zbGljZShhR1swXS5sZW5ndGgpfHxhSH1hRC5wdXNoKChhST1bXSkpfWk9ZmFsc2U7aWYoKGFHPUcuZXhlYyhhSCkpKXtpPWFHLnNoaWZ0KCk7YUkucHVzaCh7dmFsdWU6aSx0eXBlOmFHWzBdLnJlcGxhY2UoeCwiICIpfSk7YUg9YUguc2xpY2UoaS5sZW5ndGgpfWZvcihhSiBpbiB0LmZpbHRlcil7aWYoKGFHPWFoW2FKXS5leGVjKGFIKSkmJighZVthSl18fChhRz1lW2FKXShhRykpKSl7aT1hRy5zaGlmdCgpO2FJLnB1c2goe3ZhbHVlOmksdHlwZTphSixtYXRjaGVzOmFHfSk7YUg9YUguc2xpY2UoaS5sZW5ndGgpfX1pZighaSl7YnJlYWt9fXJldHVybiBhSz9hSC5sZW5ndGg6YUg/Qi5lcnJvcihhRik6YW8oYUYsYUQpLnNsaWNlKDApfWZ1bmN0aW9uIG8oYUYpe3ZhciBhRT0wLGFEPWFGLmxlbmd0aCxlPSIiO2Zvcig7YUU8YUQ7YUUrKyl7ZSs9YUZbYUVdLnZhbHVlfXJldHVybiBlfWZ1bmN0aW9uIHcoYUYsYUQsYUUpe3ZhciBlPWFELmRpcixhRz1hRSYmZT09PSJwYXJlbnROb2RlIixpPWFqKys7cmV0dXJuIGFELmZpcnN0P2Z1bmN0aW9uKGFKLGFJLGFIKXt3aGlsZSgoYUo9YUpbZV0pKXtpZihhSi5ub2RlVHlwZT09PTF8fGFHKXtyZXR1cm4gYUYoYUosYUksYUgpfX19OmZ1bmN0aW9uKGFMLGFKLGFJKXt2YXIgYU0sYUssYUg9W2F6LGldO2lmKGFJKXt3aGlsZSgoYUw9YUxbZV0pKXtpZihhTC5ub2RlVHlwZT09PTF8fGFHKXtpZihhRihhTCxhSixhSSkpe3JldHVybiB0cnVlfX19fWVsc2V7d2hpbGUoKGFMPWFMW2VdKSl7aWYoYUwubm9kZVR5cGU9PT0xfHxhRyl7YUs9YUxbYXBdfHwoYUxbYXBdPXt9KTtpZigoYU09YUtbZV0pJiZhTVswXT09PWF6JiZhTVsxXT09PWkpe3JldHVybihhSFsyXT1hTVsyXSl9ZWxzZXthS1tlXT1hSDtpZigoYUhbMl09YUYoYUwsYUosYUkpKSl7cmV0dXJuIHRydWV9fX19fX19ZnVuY3Rpb24gYUIoZSl7cmV0dXJuIGUubGVuZ3RoPjE/ZnVuY3Rpb24oYUcsYUYsYUQpe3ZhciBhRT1lLmxlbmd0aDt3aGlsZShhRS0tKXtpZighZVthRV0oYUcsYUYsYUQpKXtyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfTplWzBdfWZ1bmN0aW9uIEUoYUQsYUcsYUYpe3ZhciBhRT0wLGU9YUcubGVuZ3RoO2Zvcig7YUU8ZTthRSsrKXtCKGFELGFHW2FFXSxhRil9cmV0dXJuIGFGfWZ1bmN0aW9uIGFmKGUsYUQsYUUsYUYsYUkpe3ZhciBhRyxhTD1bXSxhSD0wLGFKPWUubGVuZ3RoLGFLPWFEIT1udWxsO2Zvcig7YUg8YUo7YUgrKyl7aWYoKGFHPWVbYUhdKSl7aWYoIWFFfHxhRShhRyxhRixhSSkpe2FMLnB1c2goYUcpO2lmKGFLKXthRC5wdXNoKGFIKX19fX1yZXR1cm4gYUx9ZnVuY3Rpb24gbShhRCxpLGFGLGFFLGFHLGUpe2lmKGFFJiYhYUVbYXBdKXthRT1tKGFFKX1pZihhRyYmIWFHW2FwXSl7YUc9bShhRyxlKX1yZXR1cm4gcChmdW5jdGlvbihhUixhTyxhSixhUSl7dmFyIGFULGFQLGFMLGFLPVtdLGFTPVtdLGFJPWFPLmxlbmd0aCxhSD1hUnx8RShpfHwiKiIsYUoubm9kZVR5cGU/W2FKXTphSixbXSksYU09YUQmJihhUnx8IWkpP2FmKGFILGFLLGFELGFKLGFRKTphSCxhTj1hRj9hR3x8KGFSP2FEOmFJfHxhRSk/W106YU86YU07aWYoYUYpe2FGKGFNLGFOLGFKLGFRKX1pZihhRSl7YVQ9YWYoYU4sYVMpO2FFKGFULFtdLGFKLGFRKTthUD1hVC5sZW5ndGg7d2hpbGUoYVAtLSl7aWYoKGFMPWFUW2FQXSkpe2FOW2FTW2FQXV09IShhTVthU1thUF1dPWFMKX19fWlmKGFSKXtpZihhR3x8YUQpe2lmKGFHKXthVD1bXTthUD1hTi5sZW5ndGg7d2hpbGUoYVAtLSl7aWYoKGFMPWFOW2FQXSkpe2FULnB1c2goKGFNW2FQXT1hTCkpfX1hRyhudWxsLChhTj1bXSksYVQsYVEpfWFQPWFOLmxlbmd0aDt3aGlsZShhUC0tKXtpZigoYUw9YU5bYVBdKSYmKGFUPWFHP2ouY2FsbChhUixhTCk6YUtbYVBdKT4tMSl7YVJbYVRdPSEoYU9bYVRdPWFMKX19fX1lbHNle2FOPWFmKGFOPT09YU8/YU4uc3BsaWNlKGFJLGFOLmxlbmd0aCk6YU4pO2lmKGFHKXthRyhudWxsLGFPLGFOLGFRKX1lbHNle2IuYXBwbHkoYU8sYU4pfX19KX1mdW5jdGlvbiBhcShhSSl7dmFyIGFELGFHLGFFLGFIPWFJLmxlbmd0aCxhTD10LnJlbGF0aXZlW2FJWzBdLnR5cGVdLGFNPWFMfHx0LnJlbGF0aXZlWyIgIl0sYUY9YUw/MTowLGFKPXcoZnVuY3Rpb24oaSl7cmV0dXJuIGk9PT1hRH0sYU0sdHJ1ZSksYUs9dyhmdW5jdGlvbihpKXtyZXR1cm4gai5jYWxsKGFELGkpPi0xfSxhTSx0cnVlKSxlPVtmdW5jdGlvbihhTyxhTixpKXtyZXR1cm4oIWFMJiYoaXx8YU4hPT1hQykpfHwoKGFEPWFOKS5ub2RlVHlwZT9hSihhTyxhTixpKTphSyhhTyxhTixpKSl9XTtmb3IoO2FGPGFIO2FGKyspe2lmKChhRz10LnJlbGF0aXZlW2FJW2FGXS50eXBlXSkpe2U9W3coYUIoZSksYUcpXX1lbHNle2FHPXQuZmlsdGVyW2FJW2FGXS50eXBlXS5hcHBseShudWxsLGFJW2FGXS5tYXRjaGVzKTtpZihhR1thcF0pe2FFPSsrYUY7Zm9yKDthRTxhSDthRSsrKXtpZih0LnJlbGF0aXZlW2FJW2FFXS50eXBlXSl7YnJlYWt9fXJldHVybiBtKGFGPjEmJmFCKGUpLGFGPjEmJm8oYUkuc2xpY2UoMCxhRi0xKS5jb25jYXQoe3ZhbHVlOmFJW2FGLTJdLnR5cGU9PT0iICI/IioiOiIifSkpLnJlcGxhY2UoeCwiJDEiKSxhRyxhRjxhRSYmYXEoYUkuc2xpY2UoYUYsYUUpKSxhRTxhSCYmYXEoKGFJPWFJLnNsaWNlKGFFKSkpLGFFPGFIJiZvKGFJKSl9ZS5wdXNoKGFHKX19cmV0dXJuIGFCKGUpfWZ1bmN0aW9uIGFkKGFFLGFEKXt2YXIgZT1hRC5sZW5ndGg+MCxhRj1hRS5sZW5ndGg+MCxpPWZ1bmN0aW9uKGFQLGFKLGFPLGFOLGFTKXt2YXIgYUssYUwsYVEsYVU9MCxhTT0iMCIsYUc9YVAmJltdLGFWPVtdLGFUPWFDLGFJPWFQfHxhRiYmdC5maW5kLlRBRygiKiIsYVMpLGFIPShheis9YVQ9PW51bGw/MTpNYXRoLnJhbmRvbSgpfHwwLjEpLGFSPWFJLmxlbmd0aDtpZihhUyl7YUM9YUohPT1IJiZhSn1mb3IoO2FNIT09YVImJihhSz1hSVthTV0pIT1udWxsO2FNKyspe2lmKGFGJiZhSyl7YUw9MDt3aGlsZSgoYVE9YUVbYUwrK10pKXtpZihhUShhSyxhSixhTykpe2FOLnB1c2goYUspO2JyZWFrfX1pZihhUyl7YXo9YUh9fWlmKGUpe2lmKChhSz0hYVEmJmFLKSl7YVUtLX1pZihhUCl7YUcucHVzaChhSyl9fX1hVSs9YU07aWYoZSYmYU0hPT1hVSl7YUw9MDt3aGlsZSgoYVE9YURbYUwrK10pKXthUShhRyxhVixhSixhTyl9aWYoYVApe2lmKGFVPjApe3doaWxlKGFNLS0pe2lmKCEoYUdbYU1dfHxhVlthTV0pKXthVlthTV09YXQuY2FsbChhTil9fX1hVj1hZihhVil9Yi5hcHBseShhTixhVik7aWYoYVMmJiFhUCYmYVYubGVuZ3RoPjAmJihhVSthRC5sZW5ndGgpPjEpe0IudW5pcXVlU29ydChhTil9fWlmKGFTKXthej1hSDthQz1hVH1yZXR1cm4gYUd9O3JldHVybiBlP3AoaSk6aX1hYj1CLmNvbXBpbGU9ZnVuY3Rpb24oZSxhRSl7dmFyIGFGLGFEPVtdLGFIPVtdLGFHPUxbZSsiICJdO2lmKCFhRyl7aWYoIWFFKXthRT1uKGUpfWFGPWFFLmxlbmd0aDt3aGlsZShhRi0tKXthRz1hcShhRVthRl0pO2lmKGFHW2FwXSl7YUQucHVzaChhRyl9ZWxzZXthSC5wdXNoKGFHKX19YUc9TChlLGFkKGFILGFEKSk7YUcuc2VsZWN0b3I9ZX1yZXR1cm4gYUd9O2F4PUIuc2VsZWN0PWZ1bmN0aW9uKGFFLGUsYUYsYUkpe3ZhciBhRyxhTCxhRCxhTSxhSixhSz10eXBlb2YgYUU9PT0iZnVuY3Rpb24iJiZhRSxhSD0hYUkmJm4oKGFFPWFLLnNlbGVjdG9yfHxhRSkpO2FGPWFGfHxbXTtpZihhSC5sZW5ndGg9PT0xKXthTD1hSFswXT1hSFswXS5zbGljZSgwKTtpZihhTC5sZW5ndGg+MiYmKGFEPWFMWzBdKS50eXBlPT09IklEIiYmYXkuZ2V0QnlJZCYmZS5ub2RlVHlwZT09PTkmJmFuJiZ0LnJlbGF0aXZlW2FMWzFdLnR5cGVdKXtlPSh0LmZpbmQuSUQoYUQubWF0Y2hlc1swXS5yZXBsYWNlKHksYWspLGUpfHxbXSlbMF07aWYoIWUpe3JldHVybiBhRn1lbHNle2lmKGFLKXtlPWUucGFyZW50Tm9kZX19YUU9YUUuc2xpY2UoYUwuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWFHPWFoLm5lZWRzQ29udGV4dC50ZXN0KGFFKT8wOmFMLmxlbmd0aDt3aGlsZShhRy0tKXthRD1hTFthR107aWYodC5yZWxhdGl2ZVsoYU09YUQudHlwZSldKXticmVha31pZigoYUo9dC5maW5kW2FNXSkpe2lmKChhST1hSihhRC5tYXRjaGVzWzBdLnJlcGxhY2UoeSxhayksYWcudGVzdChhTFswXS50eXBlKSYmWShlLnBhcmVudE5vZGUpfHxlKSkpe2FMLnNwbGljZShhRywxKTthRT1hSS5sZW5ndGgmJm8oYUwpO2lmKCFhRSl7Yi5hcHBseShhRixhSSk7cmV0dXJuIGFGfWJyZWFrfX19fShhS3x8YWIoYUUsYUgpKShhSSxlLCFhbixhRixhZy50ZXN0KGFFKSYmWShlLnBhcmVudE5vZGUpfHxlKTtyZXR1cm4gYUZ9O2F5LnNvcnRTdGFibGU9YXAuc3BsaXQoIiIpLnNvcnQoSikuam9pbigiIik9PT1hcDtheS5kZXRlY3REdXBsaWNhdGVzPSEhYWM7YWUoKTtheS5zb3J0RGV0YWNoZWQ9bChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihILmNyZWF0ZUVsZW1lbnQoImRpdiIpKSYxfSk7aWYoIWwoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iO3JldHVybiBlLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iIyJ9KSl7YUEoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGksZSxhRCl7aWYoIWFEKXtyZXR1cm4gaS5nZXRBdHRyaWJ1dGUoZSxlLnRvTG93ZXJDYXNlKCk9PT0idHlwZSI/MToyKX19KX1pZighYXkuYXR0cmlidXRlc3x8IWwoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxpbnB1dC8+IjtlLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpO3JldHVybiBlLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPT09IiJ9KSl7YUEoInZhbHVlIixmdW5jdGlvbihpLGUsYUQpe2lmKCFhRCYmaS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0Iil7cmV0dXJuIGkuZGVmYXVsdFZhbHVlfX0pfWlmKCFsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09bnVsbH0pKXthQShjLGZ1bmN0aW9uKGksZSxhRSl7dmFyIGFEO2lmKCFhRSl7cmV0dXJuIGlbZV09PT10cnVlP2UudG9Mb3dlckNhc2UoKTooYUQ9aS5nZXRBdHRyaWJ1dGVOb2RlKGUpKSYmYUQuc3BlY2lmaWVkP2FELnZhbHVlOm51bGx9fSl9aWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpe2RlZmluZShmdW5jdGlvbigpe3JldHVybiBCfSl9ZWxzZXtpZih0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCImJm1vZHVsZS5leHBvcnRzKXttb2R1bGUuZXhwb3J0cz1CfWVsc2V7YXYuU2l6emxlPUJ9fX0pKHdpbmRvdyk7KGZ1bmN0aW9uKCl7aWYodHlwZW9mIFNpenpsZSE9PSJ1bmRlZmluZWQiKXtyZXR1cm59aWYodHlwZW9mIGRlZmluZSE9PSJ1bmRlZmluZWQiJiZkZWZpbmUuYW1kKXt3aW5kb3cuU2l6emxlPVByb3RvdHlwZS5fYWN0dWFsX3NpenpsZTt3aW5kb3cuZGVmaW5lPVByb3RvdHlwZS5fb3JpZ2luYWxfZGVmaW5lO2RlbGV0ZSBQcm90b3R5cGUuX2FjdHVhbF9zaXp6bGU7ZGVsZXRlIFByb3RvdHlwZS5fb3JpZ2luYWxfZGVmaW5lfWVsc2V7aWYodHlwZW9mIG1vZHVsZSE9PSJ1bmRlZmluZWQiJiZtb2R1bGUuZXhwb3J0cyl7d2luZG93LlNpenpsZT1tb2R1bGUuZXhwb3J0czttb2R1bGUuZXhwb3J0cz17fX19fSkoKTsoZnVuY3Rpb24oYyl7dmFyIGQ9UHJvdG90eXBlLlNlbGVjdG9yLmV4dGVuZEVsZW1lbnRzO2Z1bmN0aW9uIGEoZSxmKXtyZXR1cm4gZChjKGUsZnx8ZG9jdW1lbnQpKX1mdW5jdGlvbiBiKGYsZSl7cmV0dXJuIGMubWF0Y2hlcyhlLFtmXSkubGVuZ3RoPT0xfVByb3RvdHlwZS5TZWxlY3Rvci5lbmdpbmU9YztQcm90b3R5cGUuU2VsZWN0b3Iuc2VsZWN0PWE7UHJvdG90eXBlLlNlbGVjdG9yLm1hdGNoPWJ9KShTaXp6bGUpO3dpbmRvdy5TaXp6bGU9UHJvdG90eXBlLl9vcmlnaW5hbF9wcm9wZXJ0eTtkZWxldGUgUHJvdG90eXBlLl9vcmlnaW5hbF9wcm9wZXJ0eTt2YXIgRm9ybT17cmVzZXQ6ZnVuY3Rpb24oYSl7YT0kKGEpO2EucmVzZXQoKTtyZXR1cm4gYX0sc2VyaWFsaXplRWxlbWVudHM6ZnVuY3Rpb24oaCxkKXtpZih0eXBlb2YgZCE9Im9iamVjdCIpe2Q9e2hhc2g6ISFkfX1lbHNle2lmKE9iamVjdC5pc1VuZGVmaW5lZChkLmhhc2gpKXtkLmhhc2g9dHJ1ZX19dmFyIGUsZyxhPWZhbHNlLGY9ZC5zdWJtaXQsYixjO2lmKGQuaGFzaCl7Yz17fTtiPWZ1bmN0aW9uKGksaixrKXtpZihqIGluIGkpe2lmKCFPYmplY3QuaXNBcnJheShpW2pdKSl7aVtqXT1baVtqXV19aVtqXT1pW2pdLmNvbmNhdChrKX1lbHNle2lbal09a31yZXR1cm4gaX19ZWxzZXtjPSIiO2I9ZnVuY3Rpb24oaSxrLGope2lmKCFPYmplY3QuaXNBcnJheShqKSl7aj1bal19aWYoIWoubGVuZ3RoKXtyZXR1cm4gaX12YXIgbD1lbmNvZGVVUklDb21wb25lbnQoaykuZ3N1YigvJTIwLywiKyIpO3JldHVybiBpKyhpPyImIjoiIikrai5tYXAoZnVuY3Rpb24obSl7bT1tLmdzdWIoLyhccik/XG4vLCJcclxuIik7bT1lbmNvZGVVUklDb21wb25lbnQobSk7bT1tLmdzdWIoLyUyMC8sIisiKTtyZXR1cm4gbCsiPSIrbX0pLmpvaW4oIiYiKX19cmV0dXJuIGguaW5qZWN0KGMsZnVuY3Rpb24oaSxqKXtpZighai5kaXNhYmxlZCYmai5uYW1lKXtlPWoubmFtZTtnPSQoaikuZ2V0VmFsdWUoKTtpZihnIT1udWxsJiZqLnR5cGUhPSJmaWxlIiYmKGoudHlwZSE9InN1Ym1pdCJ8fCghYSYmZiE9PWZhbHNlJiYoIWZ8fGU9PWYpJiYoYT10cnVlKSkpKXtpPWIoaSxlLGcpfX1yZXR1cm4gaX0pfX07Rm9ybS5NZXRob2RzPXtzZXJpYWxpemU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gRm9ybS5zZXJpYWxpemVFbGVtZW50cyhGb3JtLmdldEVsZW1lbnRzKGIpLGEpfSxnZXRFbGVtZW50czpmdW5jdGlvbihlKXt2YXIgZj0kKGUpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7dmFyIGQsYz1bXSxiPUZvcm0uRWxlbWVudC5TZXJpYWxpemVycztmb3IodmFyIGE9MDtkPWZbYV07YSsrKXtpZihiW2QudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSl7Yy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGQpKX19cmV0dXJuIGN9LGdldElucHV0czpmdW5jdGlvbihnLGMsZCl7Zz0kKGcpO3ZhciBhPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7aWYoIWMmJiFkKXtyZXR1cm4gJEEoYSkubWFwKEVsZW1lbnQuZXh0ZW5kKX1mb3IodmFyIGU9MCxoPVtdLGY9YS5sZW5ndGg7ZTxmO2UrKyl7dmFyIGI9YVtlXTtpZigoYyYmYi50eXBlIT1jKXx8KGQmJmIubmFtZSE9ZCkpe2NvbnRpbnVlfWgucHVzaChFbGVtZW50LmV4dGVuZChiKSl9cmV0dXJuIGh9LGRpc2FibGU6ZnVuY3Rpb24oYSl7YT0kKGEpO0Zvcm0uZ2V0RWxlbWVudHMoYSkuaW52b2tlKCJkaXNhYmxlIik7cmV0dXJuIGF9LGVuYWJsZTpmdW5jdGlvbihhKXthPSQoYSk7Rm9ybS5nZXRFbGVtZW50cyhhKS5pbnZva2UoImVuYWJsZSIpO3JldHVybiBhfSxmaW5kRmlyc3RFbGVtZW50OmZ1bmN0aW9uKGIpe3ZhciBjPSQoYikuZ2V0RWxlbWVudHMoKS5maW5kQWxsKGZ1bmN0aW9uKGQpe3JldHVybiJoaWRkZW4iIT1kLnR5cGUmJiFkLmRpc2FibGVkfSk7dmFyIGE9Yy5maW5kQWxsKGZ1bmN0aW9uKGQpe3JldHVybiBkLmhhc0F0dHJpYnV0ZSgidGFiSW5kZXgiKSYmZC50YWJJbmRleD49MH0pLnNvcnRCeShmdW5jdGlvbihkKXtyZXR1cm4gZC50YWJJbmRleH0pLmZpcnN0KCk7cmV0dXJuIGE/YTpjLmZpbmQoZnVuY3Rpb24oZCl7cmV0dXJuL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWEpJC9pLnRlc3QoZC50YWdOYW1lKX0pfSxmb2N1c0ZpcnN0RWxlbWVudDpmdW5jdGlvbihiKXtiPSQoYik7dmFyIGE9Yi5maW5kRmlyc3RFbGVtZW50KCk7aWYoYSl7YS5hY3RpdmF0ZSgpfXJldHVybiBifSxyZXF1ZXN0OmZ1bmN0aW9uKGIsYSl7Yj0kKGIpLGE9T2JqZWN0LmNsb25lKGF8fHt9KTt2YXIgZD1hLnBhcmFtZXRlcnMsYz1iLnJlYWRBdHRyaWJ1dGUoImFjdGlvbiIpfHwiIjtpZihjLmJsYW5rKCkpe2M9d2luZG93LmxvY2F0aW9uLmhyZWZ9YS5wYXJhbWV0ZXJzPWIuc2VyaWFsaXplKHRydWUpO2lmKGQpe2lmKE9iamVjdC5pc1N0cmluZyhkKSl7ZD1kLnRvUXVlcnlQYXJhbXMoKX1PYmplY3QuZXh0ZW5kKGEucGFyYW1ldGVycyxkKX1pZihiLmhhc0F0dHJpYnV0ZSgibWV0aG9kIikmJiFhLm1ldGhvZCl7YS5tZXRob2Q9Yi5tZXRob2R9cmV0dXJuIG5ldyBBamF4LlJlcXVlc3QoYyxhKX19O0Zvcm0uRWxlbWVudD17Zm9jdXM6ZnVuY3Rpb24oYSl7JChhKS5mb2N1cygpO3JldHVybiBhfSxzZWxlY3Q6ZnVuY3Rpb24oYSl7JChhKS5zZWxlY3QoKTtyZXR1cm4gYX19O0Zvcm0uRWxlbWVudC5NZXRob2RzPXtzZXJpYWxpemU6ZnVuY3Rpb24oYSl7YT0kKGEpO2lmKCFhLmRpc2FibGVkJiZhLm5hbWUpe3ZhciBiPWEuZ2V0VmFsdWUoKTtpZihiIT11bmRlZmluZWQpe3ZhciBjPXt9O2NbYS5uYW1lXT1iO3JldHVybiBPYmplY3QudG9RdWVyeVN0cmluZyhjKX19cmV0dXJuIiJ9LGdldFZhbHVlOmZ1bmN0aW9uKGEpe2E9JChhKTt2YXIgYj1hLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzW2JdKGEpfSxzZXRWYWx1ZTpmdW5jdGlvbihhLGIpe2E9JChhKTt2YXIgYz1hLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnNbY10oYSxiKTtyZXR1cm4gYX0sY2xlYXI6ZnVuY3Rpb24oYSl7JChhKS52YWx1ZT0iIjtyZXR1cm4gYX0scHJlc2VudDpmdW5jdGlvbihhKXtyZXR1cm4gJChhKS52YWx1ZSE9IiJ9LGFjdGl2YXRlOmZ1bmN0aW9uKGEpe2E9JChhKTt0cnl7YS5mb2N1cygpO2lmKGEuc2VsZWN0JiYoYS50YWdOYW1lLnRvTG93ZXJDYXNlKCkhPSJpbnB1dCJ8fCEoL14oPzpidXR0b258cmVzZXR8c3VibWl0KSQvaS50ZXN0KGEudHlwZSkpKSl7YS5zZWxlY3QoKX19Y2F0Y2goYil7fXJldHVybiBhfSxkaXNhYmxlOmZ1bmN0aW9uKGEpe2E9JChhKTthLmRpc2FibGVkPXRydWU7cmV0dXJuIGF9LGVuYWJsZTpmdW5jdGlvbihhKXthPSQoYSk7YS5kaXNhYmxlZD1mYWxzZTtyZXR1cm4gYX19O3ZhciBGaWVsZD1Gb3JtLkVsZW1lbnQ7dmFyICRGPUZvcm0uRWxlbWVudC5NZXRob2RzLmdldFZhbHVlO0Zvcm0uRWxlbWVudC5TZXJpYWxpemVycz0oZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGgsaSl7c3dpdGNoKGgudHlwZS50b0xvd2VyQ2FzZSgpKXtjYXNlImNoZWNrYm94IjpjYXNlInJhZGlvIjpyZXR1cm4gZihoLGkpO2RlZmF1bHQ6cmV0dXJuIGUoaCxpKX19ZnVuY3Rpb24gZihoLGkpe2lmKE9iamVjdC5pc1VuZGVmaW5lZChpKSl7cmV0dXJuIGguY2hlY2tlZD9oLnZhbHVlOm51bGx9ZWxzZXtoLmNoZWNrZWQ9ISFpfX1mdW5jdGlvbiBlKGgsaSl7aWYoT2JqZWN0LmlzVW5kZWZpbmVkKGkpKXtyZXR1cm4gaC52YWx1ZX1lbHNle2gudmFsdWU9aX19ZnVuY3Rpb24gYShrLG4pe2lmKE9iamVjdC5pc1VuZGVmaW5lZChuKSl7cmV0dXJuKGsudHlwZT09PSJzZWxlY3Qtb25lIj9jOmQpKGspfXZhciBqLGwsbz0hT2JqZWN0LmlzQXJyYXkobik7Zm9yKHZhciBoPTAsbT1rLmxlbmd0aDtoPG07aCsrKXtqPWsub3B0aW9uc1toXTtsPXRoaXMub3B0aW9uVmFsdWUoaik7aWYobyl7aWYobD09bil7ai5zZWxlY3RlZD10cnVlO3JldHVybn19ZWxzZXtqLnNlbGVjdGVkPW4uaW5jbHVkZShsKX19fWZ1bmN0aW9uIGMoaSl7dmFyIGg9aS5zZWxlY3RlZEluZGV4O3JldHVybiBoPj0wP2coaS5vcHRpb25zW2hdKTpudWxsfWZ1bmN0aW9uIGQobCl7dmFyIGgsbT1sLmxlbmd0aDtpZighbSl7cmV0dXJuIG51bGx9Zm9yKHZhciBrPTAsaD1bXTtrPG07aysrKXt2YXIgaj1sLm9wdGlvbnNba107aWYoai5zZWxlY3RlZCl7aC5wdXNoKGcoaikpfX1yZXR1cm4gaH1mdW5jdGlvbiBnKGgpe3JldHVybiBFbGVtZW50Lmhhc0F0dHJpYnV0ZShoLCJ2YWx1ZSIpP2gudmFsdWU6aC50ZXh0fXJldHVybntpbnB1dDpiLGlucHV0U2VsZWN0b3I6Zix0ZXh0YXJlYTplLHNlbGVjdDphLHNlbGVjdE9uZTpjLHNlbGVjdE1hbnk6ZCxvcHRpb25WYWx1ZTpnLGJ1dHRvbjplfX0pKCk7QWJzdHJhY3QuVGltZWRPYnNlcnZlcj1DbGFzcy5jcmVhdGUoUGVyaW9kaWNhbEV4ZWN1dGVyLHtpbml0aWFsaXplOmZ1bmN0aW9uKCRzdXBlcixhLGIsYyl7JHN1cGVyKGMsYik7dGhpcy5lbGVtZW50PSQoYSk7dGhpcy5sYXN0VmFsdWU9dGhpcy5nZXRWYWx1ZSgpfSxleGVjdXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRWYWx1ZSgpO2lmKE9iamVjdC5pc1N0cmluZyh0aGlzLmxhc3RWYWx1ZSkmJk9iamVjdC5pc1N0cmluZyhhKT90aGlzLmxhc3RWYWx1ZSE9YTpTdHJpbmcodGhpcy5sYXN0VmFsdWUpIT1TdHJpbmcoYSkpe3RoaXMuY2FsbGJhY2sodGhpcy5lbGVtZW50LGEpO3RoaXMubGFzdFZhbHVlPWF9fX0pO0Zvcm0uRWxlbWVudC5PYnNlcnZlcj1DbGFzcy5jcmVhdGUoQWJzdHJhY3QuVGltZWRPYnNlcnZlcix7Z2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gRm9ybS5FbGVtZW50LmdldFZhbHVlKHRoaXMuZWxlbWVudCl9fSk7Rm9ybS5PYnNlcnZlcj1DbGFzcy5jcmVhdGUoQWJzdHJhY3QuVGltZWRPYnNlcnZlcix7Z2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KX19KTtBYnN0cmFjdC5FdmVudE9ic2VydmVyPUNsYXNzLmNyZWF0ZSh7aW5pdGlhbGl6ZTpmdW5jdGlvbihhLGIpe3RoaXMuZWxlbWVudD0kKGEpO3RoaXMuY2FsbGJhY2s9Yjt0aGlzLmxhc3RWYWx1ZT10aGlzLmdldFZhbHVlKCk7aWYodGhpcy5lbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKT09ImZvcm0iKXt0aGlzLnJlZ2lzdGVyRm9ybUNhbGxiYWNrcygpfWVsc2V7dGhpcy5yZWdpc3RlckNhbGxiYWNrKHRoaXMuZWxlbWVudCl9fSxvbkVsZW1lbnRFdmVudDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0VmFsdWUoKTtpZih0aGlzLmxhc3RWYWx1ZSE9YSl7dGhpcy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsYSk7dGhpcy5sYXN0VmFsdWU9YX19LHJlZ2lzdGVyRm9ybUNhbGxiYWNrczpmdW5jdGlvbigpe0Zvcm0uZ2V0RWxlbWVudHModGhpcy5lbGVtZW50KS5lYWNoKHRoaXMucmVnaXN0ZXJDYWxsYmFjayx0aGlzKX0scmVnaXN0ZXJDYWxsYmFjazpmdW5jdGlvbihhKXtpZihhLnR5cGUpe3N3aXRjaChhLnR5cGUudG9Mb3dlckNhc2UoKSl7Y2FzZSJjaGVja2JveCI6Y2FzZSJyYWRpbyI6RXZlbnQub2JzZXJ2ZShhLCJjbGljayIsdGhpcy5vbkVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTticmVhaztkZWZhdWx0OkV2ZW50Lm9ic2VydmUoYSwiY2hhbmdlIix0aGlzLm9uRWxlbWVudEV2ZW50LmJpbmQodGhpcykpO2JyZWFrfX19fSk7Rm9ybS5FbGVtZW50LkV2ZW50T2JzZXJ2ZXI9Q2xhc3MuY3JlYXRlKEFic3RyYWN0LkV2ZW50T2JzZXJ2ZXIse2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIEZvcm0uRWxlbWVudC5nZXRWYWx1ZSh0aGlzLmVsZW1lbnQpfX0pO0Zvcm0uRXZlbnRPYnNlcnZlcj1DbGFzcy5jcmVhdGUoQWJzdHJhY3QuRXZlbnRPYnNlcnZlcix7Z2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KX19KTsoZnVuY3Rpb24oRCl7dmFyIHU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dmFyIGQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBrPSJvbm1vdXNlZW50ZXIiIGluIGQmJiJvbm1vdXNlbGVhdmUiIGluIGQ7dmFyIEw9e0tFWV9CQUNLU1BBQ0U6OCxLRVlfVEFCOjksS0VZX1JFVFVSTjoxMyxLRVlfRVNDOjI3LEtFWV9MRUZUOjM3LEtFWV9VUDozOCxLRVlfUklHSFQ6MzksS0VZX0RPV046NDAsS0VZX0RFTEVURTo0NixLRVlfSE9NRTozNixLRVlfRU5EOjM1LEtFWV9QQUdFVVA6MzMsS0VZX1BBR0VET1dOOjM0LEtFWV9JTlNFUlQ6NDV9O3ZhciBBPWZ1bmN0aW9uKFgpe3JldHVybiBmYWxzZX07aWYod2luZG93LmF0dGFjaEV2ZW50KXtpZih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcil7QT1mdW5jdGlvbihYKXtyZXR1cm4gIShYIGluc3RhbmNlb2Ygd2luZG93LkV2ZW50KX19ZWxzZXtBPWZ1bmN0aW9uKFgpe3JldHVybiB0cnVlfX19dmFyIE87ZnVuY3Rpb24gTShZLFgpe3JldHVybiBZLndoaWNoPyhZLndoaWNoPT09WCsxKTooWS5idXR0b249PT1YKX12YXIgVz17MDoxLDE6NCwyOjJ9O2Z1bmN0aW9uIFMoWSxYKXtyZXR1cm4gWS5idXR0b249PT1XW1hdfWZ1bmN0aW9uIFAoWSxYKXtzd2l0Y2goWCl7Y2FzZSAwOnJldHVybiBZLndoaWNoPT0xJiYhWS5tZXRhS2V5O2Nhc2UgMTpyZXR1cm4gWS53aGljaD09Mnx8KFkud2hpY2g9PTEmJlkubWV0YUtleSk7Y2FzZSAyOnJldHVybiBZLndoaWNoPT0zO2RlZmF1bHQ6cmV0dXJuIGZhbHNlfX1pZih3aW5kb3cuYXR0YWNoRXZlbnQpe2lmKCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcil7Tz1TfWVsc2V7Tz1mdW5jdGlvbihZLFgpe3JldHVybiBBKFkpP1MoWSxYKTpNKFksWCl9fX1lbHNle2lmKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCl7Tz1QfWVsc2V7Tz1NfX1mdW5jdGlvbiBCKFgpe3JldHVybiBPKFgsMCl9ZnVuY3Rpb24gaShYKXtyZXR1cm4gTyhYLDEpfWZ1bmN0aW9uIGUoWCl7cmV0dXJuIE8oWCwyKX1mdW5jdGlvbiBvKFgpe3JldHVybiBFbGVtZW50LmV4dGVuZChLKFgpKX1mdW5jdGlvbiBLKFope1o9TC5leHRlbmQoWik7dmFyIFk9Wi50YXJnZXQsWD1aLnR5cGUsYWE9Wi5jdXJyZW50VGFyZ2V0O2lmKGFhJiZhYS50YWdOYW1lKXtpZihYPT09ImxvYWQifHxYPT09ImVycm9yInx8KFg9PT0iY2xpY2siJiZhYS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiZhYS50eXBlPT09InJhZGlvIikpe1k9YWF9fXJldHVybiBZLm5vZGVUeXBlPT1Ob2RlLlRFWFRfTk9ERT9ZLnBhcmVudE5vZGU6WX1mdW5jdGlvbiBqKFosYWEpe3ZhciBZPUsoWiksWD1Qcm90b3R5cGUuU2VsZWN0b3I7aWYoIWFhKXtyZXR1cm4gRWxlbWVudC5leHRlbmQoWSl9d2hpbGUoWSl7aWYoT2JqZWN0LmlzRWxlbWVudChZKSYmWC5tYXRjaChZLGFhKSl7cmV0dXJuIEVsZW1lbnQuZXh0ZW5kKFkpfVk9WS5wYXJlbnROb2RlfX1mdW5jdGlvbiB0KFgpe3JldHVybnt4OlUoWCkseTpUKFgpfX1mdW5jdGlvbiBVKFope3ZhciBZPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxYPWRvY3VtZW50LmJvZHl8fHtzY3JvbGxMZWZ0OjB9O3JldHVybiBaLnBhZ2VYfHwoWi5jbGllbnRYKyhZLnNjcm9sbExlZnR8fFguc2Nyb2xsTGVmdCktKFkuY2xpZW50TGVmdHx8MCkpfWZ1bmN0aW9uIFQoWil7dmFyIFk9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFg9ZG9jdW1lbnQuYm9keXx8e3Njcm9sbFRvcDowfTtyZXR1cm4gWi5wYWdlWXx8KFouY2xpZW50WSsoWS5zY3JvbGxUb3B8fFguc2Nyb2xsVG9wKS0oWS5jbGllbnRUb3B8fDApKX1mdW5jdGlvbiByKFgpe0wuZXh0ZW5kKFgpO1gucHJldmVudERlZmF1bHQoKTtYLnN0b3BQcm9wYWdhdGlvbigpO1guc3RvcHBlZD10cnVlfUwuTWV0aG9kcz17aXNMZWZ0Q2xpY2s6Qixpc01pZGRsZUNsaWNrOmksaXNSaWdodENsaWNrOmUsZWxlbWVudDpvLGZpbmRFbGVtZW50OmoscG9pbnRlcjp0LHBvaW50ZXJYOlUscG9pbnRlclk6VCxzdG9wOnJ9O3ZhciBIPU9iamVjdC5rZXlzKEwuTWV0aG9kcykuaW5qZWN0KHt9LGZ1bmN0aW9uKFgsWSl7WFtZXT1MLk1ldGhvZHNbWV0ubWV0aG9kaXplKCk7cmV0dXJuIFh9KTtpZih3aW5kb3cuYXR0YWNoRXZlbnQpe2Z1bmN0aW9uIFYoWSl7dmFyIFg7c3dpdGNoKFkudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOmNhc2UibW91c2VlbnRlciI6WD1ZLmZyb21FbGVtZW50O2JyZWFrO2Nhc2UibW91c2VvdXQiOmNhc2UibW91c2VsZWF2ZSI6WD1ZLnRvRWxlbWVudDticmVhaztkZWZhdWx0OnJldHVybiBudWxsfXJldHVybiBFbGVtZW50LmV4dGVuZChYKX12YXIgUT17c3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxCdWJibGU9dHJ1ZX0scHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLnJldHVyblZhbHVlPWZhbHNlfSxpbnNwZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgRXZlbnRdIn19O0wuZXh0ZW5kPWZ1bmN0aW9uKFksWCl7aWYoIVkpe3JldHVybiBmYWxzZX1pZighQShZKSl7cmV0dXJuIFl9aWYoWS5fZXh0ZW5kZWRCeVByb3RvdHlwZSl7cmV0dXJuIFl9WS5fZXh0ZW5kZWRCeVByb3RvdHlwZT1Qcm90b3R5cGUuZW1wdHlGdW5jdGlvbjt2YXIgWj1MLnBvaW50ZXIoWSk7T2JqZWN0LmV4dGVuZChZLHt0YXJnZXQ6WS5zcmNFbGVtZW50fHxYLHJlbGF0ZWRUYXJnZXQ6VihZKSxwYWdlWDpaLngscGFnZVk6Wi55fSk7T2JqZWN0LmV4dGVuZChZLEgpO09iamVjdC5leHRlbmQoWSxRKTtyZXR1cm4gWX19ZWxzZXtMLmV4dGVuZD1Qcm90b3R5cGUuS31pZih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcil7TC5wcm90b3R5cGU9d2luZG93LkV2ZW50LnByb3RvdHlwZXx8ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkhUTUxFdmVudHMiKS5fX3Byb3RvX187T2JqZWN0LmV4dGVuZChMLnByb3RvdHlwZSxIKX12YXIgdj17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9O2Z1bmN0aW9uIGYoWCl7cmV0dXJuIHZbWF18fFh9aWYoayl7Zj1Qcm90b3R5cGUuS31mdW5jdGlvbiBSKFgpe2lmKFg9PT13aW5kb3cpe3JldHVybiAwfWlmKHR5cGVvZiBYLl9wcm90b3R5cGVVSUQ9PT0idW5kZWZpbmVkIil7WC5fcHJvdG90eXBlVUlEPUVsZW1lbnQuU3RvcmFnZS5VSUQrK31yZXR1cm4gWC5fcHJvdG90eXBlVUlEfWZ1bmN0aW9uIEkoWCl7aWYoWD09PXdpbmRvdyl7cmV0dXJuIDB9aWYoWD09ZG9jdW1lbnQpe3JldHVybiAxfXJldHVybiBYLnVuaXF1ZUlEfWlmKCJ1bmlxdWVJRCIgaW4gdSl7Uj1JfWZ1bmN0aW9uIHgoWCl7cmV0dXJuIFguaW5jbHVkZSgiOiIpfUwuX2lzQ3VzdG9tRXZlbnQ9eDtmdW5jdGlvbiB6KFosWSl7dmFyIFg9RC5FdmVudC5jYWNoZTtpZihPYmplY3QuaXNVbmRlZmluZWQoWSkpe1k9UihaKX1pZighWFtZXSl7WFtZXT17ZWxlbWVudDpafX1yZXR1cm4gWFtZXX1mdW5jdGlvbiBFKFksWCl7aWYoT2JqZWN0LmlzVW5kZWZpbmVkKFgpKXtYPVIoWSl9ZGVsZXRlIEQuRXZlbnQuY2FjaGVbWF19ZnVuY3Rpb24gaChaLGFjLGFmKXt2YXIgWD16KFopO2lmKCFYW2FjXSl7WFthY109W119dmFyIGFiPVhbYWNdO3ZhciBhYT1hYi5sZW5ndGg7d2hpbGUoYWEtLSl7aWYoYWJbYWFdLmhhbmRsZXI9PT1hZil7cmV0dXJuIG51bGx9fXZhciBhZD1SKFopO3ZhciBZPUQuRXZlbnQuX2NyZWF0ZVJlc3BvbmRlcihhZCxhYyxhZik7dmFyIGFlPXtyZXNwb25kZXI6WSxoYW5kbGVyOmFmfTthYi5wdXNoKGFlKTtyZXR1cm4gYWV9ZnVuY3Rpb24gcyhhYyxaLGFkKXt2YXIgWT16KGFjKTt2YXIgWD1ZW1pdfHxbXTt2YXIgYWI9WC5sZW5ndGgsYWU7d2hpbGUoYWItLSl7aWYoWFthYl0uaGFuZGxlcj09PWFkKXthZT1YW2FiXTticmVha319aWYoYWUpe3ZhciBhYT1YLmluZGV4T2YoYWUpO1guc3BsaWNlKGFhLDEpfWlmKFgubGVuZ3RoPT09MCl7ZGVsZXRlIFlbWl07aWYoT2JqZWN0LmtleXMoWSkubGVuZ3RoPT09MSYmKCJlbGVtZW50IiBpbiBZKSl7RShhYyl9fXJldHVybiBhZX1mdW5jdGlvbiBjKFosWSxhYSl7Wj0kKFopO3ZhciBhYj1oKFosWSxhYSk7aWYoYWI9PT1udWxsKXtyZXR1cm4gWn12YXIgWD1hYi5yZXNwb25kZXI7aWYoeChZKSl7cChaLFksWCl9ZWxzZXttKFosWSxYKX1yZXR1cm4gWn1mdW5jdGlvbiBtKGFhLFosWSl7dmFyIFg9ZihaKTtpZihhYS5hZGRFdmVudExpc3RlbmVyKXthYS5hZGRFdmVudExpc3RlbmVyKFgsWSxmYWxzZSl9ZWxzZXthYS5hdHRhY2hFdmVudCgib24iK1gsWSl9fWZ1bmN0aW9uIHAoWixZLFgpe2lmKFouYWRkRXZlbnRMaXN0ZW5lcil7Wi5hZGRFdmVudExpc3RlbmVyKCJkYXRhYXZhaWxhYmxlIixYLGZhbHNlKX1lbHNle1ouYXR0YWNoRXZlbnQoIm9uZGF0YWF2YWlsYWJsZSIsWCk7Wi5hdHRhY2hFdmVudCgib25sb3NlY2FwdHVyZSIsWCl9fWZ1bmN0aW9uIEooWSxYLFope1k9JChZKTt2YXIgYWI9IU9iamVjdC5pc1VuZGVmaW5lZChaKSxhYz0hT2JqZWN0LmlzVW5kZWZpbmVkKFgpO2lmKCFhYyYmIWFiKXt5KFkpO3JldHVybiBZfWlmKCFhYil7RyhZLFgpO3JldHVybiBZfXZhciBhYT1zKFksWCxaKTtpZighYWEpe3JldHVybiBZfWEoWSxYLGFhLnJlc3BvbmRlcik7cmV0dXJuIFl9ZnVuY3Rpb24gQyhhYSxaLFkpe3ZhciBYPWYoWik7aWYoYWEucmVtb3ZlRXZlbnRMaXN0ZW5lcil7YWEucmVtb3ZlRXZlbnRMaXN0ZW5lcihYLFksZmFsc2UpfWVsc2V7YWEuZGV0YWNoRXZlbnQoIm9uIitYLFkpfX1mdW5jdGlvbiBiKFosWSxYKXtpZihaLnJlbW92ZUV2ZW50TGlzdGVuZXIpe1oucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGF0YWF2YWlsYWJsZSIsWCxmYWxzZSl9ZWxzZXtaLmRldGFjaEV2ZW50KCJvbmRhdGFhdmFpbGFibGUiLFgpO1ouZGV0YWNoRXZlbnQoIm9ubG9zZWNhcHR1cmUiLFgpfX1mdW5jdGlvbiB5KGFjKXt2YXIgYWI9UihhYyksWj1ELkV2ZW50LmNhY2hlW2FiXTtpZighWil7cmV0dXJufUUoYWMsYWIpO3ZhciBYLGFhO2Zvcih2YXIgWSBpbiBaKXtpZihZPT09ImVsZW1lbnQiKXtjb250aW51ZX1YPVpbWV07YWE9WC5sZW5ndGg7d2hpbGUoYWEtLSl7YShhYyxZLFhbYWFdLnJlc3BvbmRlcil9fX1mdW5jdGlvbiBHKGFjLFope3ZhciBZPXooYWMpO3ZhciBYPVlbWl07aWYoWCl7ZGVsZXRlIFlbWl19WD1YfHxbXTt2YXIgYWI9WC5sZW5ndGg7d2hpbGUoYWItLSl7YShhYyxaLFhbYWJdLnJlc3BvbmRlcil9Zm9yKHZhciBhYSBpbiBZKXtpZihhYT09PSJlbGVtZW50Iil7Y29udGludWV9cmV0dXJufUUoYWMpfWZ1bmN0aW9uIGEoWSxYLFope2lmKHgoWCkpe2IoWSxYLFopfWVsc2V7QyhZLFgsWil9fWZ1bmN0aW9uIGcoWCl7aWYoWCE9PWRvY3VtZW50KXtyZXR1cm4gWH1pZihkb2N1bWVudC5jcmVhdGVFdmVudCYmIVguZGlzcGF0Y2hFdmVudCl7cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudH1yZXR1cm4gWH1mdW5jdGlvbiB3KGFhLFosWSxYKXthYT1nKCQoYWEpKTtpZihPYmplY3QuaXNVbmRlZmluZWQoWCkpe1g9dHJ1ZX1ZPVl8fHt9O3ZhciBhYj1OKGFhLFosWSxYKTtyZXR1cm4gTC5leHRlbmQoYWIpfWZ1bmN0aW9uIGwoYWEsWixZLFgpe3ZhciBhYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpO2FiLmluaXRFdmVudCgiZGF0YWF2YWlsYWJsZSIsWCx0cnVlKTthYi5ldmVudE5hbWU9WjthYi5tZW1vPVk7YWEuZGlzcGF0Y2hFdmVudChhYik7cmV0dXJuIGFifWZ1bmN0aW9uIG4oYWEsWixZLFgpe3ZhciBhYj1kb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpO2FiLmV2ZW50VHlwZT1YPyJvbmRhdGFhdmFpbGFibGUiOiJvbmxvc2VjYXB0dXJlIjthYi5ldmVudE5hbWU9WjthYi5tZW1vPVk7YWEuZmlyZUV2ZW50KGFiLmV2ZW50VHlwZSxhYik7cmV0dXJuIGFifXZhciBOPWRvY3VtZW50LmNyZWF0ZUV2ZW50P2w6bjtMLkhhbmRsZXI9Q2xhc3MuY3JlYXRlKHtpbml0aWFsaXplOmZ1bmN0aW9uKFosWSxYLGFhKXt0aGlzLmVsZW1lbnQ9JChaKTt0aGlzLmV2ZW50TmFtZT1ZO3RoaXMuc2VsZWN0b3I9WDt0aGlzLmNhbGxiYWNrPWFhO3RoaXMuaGFuZGxlcj10aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyl9LHN0YXJ0OmZ1bmN0aW9uKCl7TC5vYnNlcnZlKHRoaXMuZWxlbWVudCx0aGlzLmV2ZW50TmFtZSx0aGlzLmhhbmRsZXIpO3JldHVybiB0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7TC5zdG9wT2JzZXJ2aW5nKHRoaXMuZWxlbWVudCx0aGlzLmV2ZW50TmFtZSx0aGlzLmhhbmRsZXIpO3JldHVybiB0aGlzfSxoYW5kbGVFdmVudDpmdW5jdGlvbihZKXt2YXIgWD1MLmZpbmRFbGVtZW50KFksdGhpcy5zZWxlY3Rvcik7aWYoWCl7dGhpcy5jYWxsYmFjay5jYWxsKHRoaXMuZWxlbWVudCxZLFgpfX19KTtmdW5jdGlvbiBGKFosWSxYLGFhKXtaPSQoWik7aWYoT2JqZWN0LmlzRnVuY3Rpb24oWCkmJk9iamVjdC5pc1VuZGVmaW5lZChhYSkpe2FhPVgsWD1udWxsfXJldHVybiBuZXcgTC5IYW5kbGVyKFosWSxYLGFhKS5zdGFydCgpfU9iamVjdC5leHRlbmQoTCxMLk1ldGhvZHMpO09iamVjdC5leHRlbmQoTCx7ZmlyZTp3LG9ic2VydmU6YyxzdG9wT2JzZXJ2aW5nOkosb246Rn0pO0VsZW1lbnQuYWRkTWV0aG9kcyh7ZmlyZTp3LG9ic2VydmU6YyxzdG9wT2JzZXJ2aW5nOkosb246Rn0pO09iamVjdC5leHRlbmQoZG9jdW1lbnQse2ZpcmU6dy5tZXRob2RpemUoKSxvYnNlcnZlOmMubWV0aG9kaXplKCksc3RvcE9ic2VydmluZzpKLm1ldGhvZGl6ZSgpLG9uOkYubWV0aG9kaXplKCksbG9hZGVkOmZhbHNlfSk7aWYoRC5FdmVudCl7T2JqZWN0LmV4dGVuZCh3aW5kb3cuRXZlbnQsTCl9ZWxzZXtELkV2ZW50PUx9RC5FdmVudC5jYWNoZT17fTtmdW5jdGlvbiBxKCl7RC5FdmVudC5jYWNoZT1udWxsfWlmKHdpbmRvdy5hdHRhY2hFdmVudCl7d2luZG93LmF0dGFjaEV2ZW50KCJvbnVubG9hZCIscSl9dT1udWxsO2Q9bnVsbH0pKHRoaXMpOyhmdW5jdGlvbihjKXt2YXIgZz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7dmFyIGI9Im9ubW91c2VlbnRlciIgaW4gZyYmIm9ubW91c2VsZWF2ZSIgaW4gZztmdW5jdGlvbiBmKGgpe3JldHVybiAhYiYmKGg9PT0ibW91c2VlbnRlciJ8fGg9PT0ibW91c2VsZWF2ZSIpfWZ1bmN0aW9uIGQoaSxoLGope2lmKEV2ZW50Ll9pc0N1c3RvbUV2ZW50KGgpKXtyZXR1cm4gZShpLGgsail9aWYoZihoKSl7cmV0dXJuIGEoaSxoLGopfXJldHVybiBmdW5jdGlvbihsKXtpZighRXZlbnQuY2FjaGUpe3JldHVybn12YXIgaz1FdmVudC5jYWNoZVtpXS5lbGVtZW50O0V2ZW50LmV4dGVuZChsLGspO2ouY2FsbChrLGwpfX1mdW5jdGlvbiBlKGksaCxqKXtyZXR1cm4gZnVuY3Rpb24obSl7dmFyIGs9RXZlbnQuY2FjaGVbaV07dmFyIGw9ayYmay5lbGVtZW50O2lmKE9iamVjdC5pc1VuZGVmaW5lZChtLmV2ZW50TmFtZSkpe3JldHVybiBmYWxzZX1pZihtLmV2ZW50TmFtZSE9PWgpe3JldHVybiBmYWxzZX1FdmVudC5leHRlbmQobSxsKTtqLmNhbGwobCxtKX19ZnVuY3Rpb24gYShpLGgsail7cmV0dXJuIGZ1bmN0aW9uKG0pe3ZhciBrPUV2ZW50LmNhY2hlW2ldLmVsZW1lbnQ7RXZlbnQuZXh0ZW5kKG0sayk7dmFyIGw9bS5yZWxhdGVkVGFyZ2V0O3doaWxlKGwmJmwhPT1rKXt0cnl7bD1sLnBhcmVudE5vZGV9Y2F0Y2gobil7bD1rfX1pZihsPT09ayl7cmV0dXJufWouY2FsbChrLG0pfX1jLkV2ZW50Ll9jcmVhdGVSZXNwb25kZXI9ZDtnPW51bGx9KSh0aGlzKTsoZnVuY3Rpb24oYSl7dmFyIGU7ZnVuY3Rpb24gYigpe2lmKGRvY3VtZW50LmxvYWRlZCl7cmV0dXJufWlmKGUpe3dpbmRvdy5jbGVhclRpbWVvdXQoZSl9ZG9jdW1lbnQubG9hZGVkPXRydWU7ZG9jdW1lbnQuZmlyZSgiZG9tOmxvYWRlZCIpfWZ1bmN0aW9uIGQoKXtpZihkb2N1bWVudC5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIil7ZG9jdW1lbnQuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsZCk7YigpfX1mdW5jdGlvbiBjKCl7dHJ5e2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGYpe2U9Yy5kZWZlcigpO3JldHVybn1iKCl9aWYoZG9jdW1lbnQucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpe2IoKTtyZXR1cm59aWYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcil7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsYixmYWxzZSl9ZWxzZXtkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixkKTtpZih3aW5kb3c9PXRvcCl7ZT1jLmRlZmVyKCl9fUV2ZW50Lm9ic2VydmUod2luZG93LCJsb2FkIixiKX0pKHRoaXMpO0VsZW1lbnQuYWRkTWV0aG9kcygpO0hhc2gudG9RdWVyeVN0cmluZz1PYmplY3QudG9RdWVyeVN0cmluZzt2YXIgVG9nZ2xlPXtkaXNwbGF5OkVsZW1lbnQudG9nZ2xlfTtFbGVtZW50LmFkZE1ldGhvZHMoe2NoaWxkT2Y6RWxlbWVudC5NZXRob2RzLmRlc2NlbmRhbnRPZn0pO3ZhciBJbnNlcnRpb249e0JlZm9yZTpmdW5jdGlvbihhLGIpe3JldHVybiBFbGVtZW50Lmluc2VydChhLHtiZWZvcmU6Yn0pfSxUb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gRWxlbWVudC5pbnNlcnQoYSx7dG9wOmJ9KX0sQm90dG9tOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEVsZW1lbnQuaW5zZXJ0KGEse2JvdHRvbTpifSl9LEFmdGVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEVsZW1lbnQuaW5zZXJ0KGEse2FmdGVyOmJ9KX19O3ZhciAkY29udGludWU9bmV3IEVycm9yKCcidGhyb3cgJGNvbnRpbnVlIiBpcyBkZXByZWNhdGVkLCB1c2UgInJldHVybiIgaW5zdGVhZCcpO3ZhciBQb3NpdGlvbj17aW5jbHVkZVNjcm9sbE9mZnNldHM6ZmFsc2UscHJlcGFyZTpmdW5jdGlvbigpe3RoaXMuZGVsdGFYPXdpbmRvdy5wYWdlWE9mZnNldHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdHx8MDt0aGlzLmRlbHRhWT13aW5kb3cucGFnZVlPZmZzZXR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wfHwwfSx3aXRoaW46ZnVuY3Rpb24oYixhLGMpe2lmKHRoaXMuaW5jbHVkZVNjcm9sbE9mZnNldHMpe3JldHVybiB0aGlzLndpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHMoYixhLGMpfXRoaXMueGNvbXA9YTt0aGlzLnljb21wPWM7dGhpcy5vZmZzZXQ9RWxlbWVudC5jdW11bGF0aXZlT2Zmc2V0KGIpO3JldHVybihjPj10aGlzLm9mZnNldFsxXSYmYzx0aGlzLm9mZnNldFsxXStiLm9mZnNldEhlaWdodCYmYT49dGhpcy5vZmZzZXRbMF0mJmE8dGhpcy5vZmZzZXRbMF0rYi5vZmZzZXRXaWR0aCl9LHdpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHM6ZnVuY3Rpb24oYixhLGQpe3ZhciBjPUVsZW1lbnQuY3VtdWxhdGl2ZVNjcm9sbE9mZnNldChiKTt0aGlzLnhjb21wPWErY1swXS10aGlzLmRlbHRhWDt0aGlzLnljb21wPWQrY1sxXS10aGlzLmRlbHRhWTt0aGlzLm9mZnNldD1FbGVtZW50LmN1bXVsYXRpdmVPZmZzZXQoYik7cmV0dXJuKHRoaXMueWNvbXA+PXRoaXMub2Zmc2V0WzFdJiZ0aGlzLnljb21wPHRoaXMub2Zmc2V0WzFdK2Iub2Zmc2V0SGVpZ2h0JiZ0aGlzLnhjb21wPj10aGlzLm9mZnNldFswXSYmdGhpcy54Y29tcDx0aGlzLm9mZnNldFswXStiLm9mZnNldFdpZHRoKX0sb3ZlcmxhcDpmdW5jdGlvbihiLGEpe2lmKCFiKXtyZXR1cm4gMH1pZihiPT0idmVydGljYWwiKXtyZXR1cm4oKHRoaXMub2Zmc2V0WzFdK2Eub2Zmc2V0SGVpZ2h0KS10aGlzLnljb21wKS9hLm9mZnNldEhlaWdodH1pZihiPT0iaG9yaXpvbnRhbCIpe3JldHVybigodGhpcy5vZmZzZXRbMF0rYS5vZmZzZXRXaWR0aCktdGhpcy54Y29tcCkvYS5vZmZzZXRXaWR0aH19LGN1bXVsYXRpdmVPZmZzZXQ6RWxlbWVudC5NZXRob2RzLmN1bXVsYXRpdmVPZmZzZXQscG9zaXRpb25lZE9mZnNldDpFbGVtZW50Lk1ldGhvZHMucG9zaXRpb25lZE9mZnNldCxhYnNvbHV0aXplOmZ1bmN0aW9uKGEpe1Bvc2l0aW9uLnByZXBhcmUoKTtyZXR1cm4gRWxlbWVudC5hYnNvbHV0aXplKGEpfSxyZWxhdGl2aXplOmZ1bmN0aW9uKGEpe1Bvc2l0aW9uLnByZXBhcmUoKTtyZXR1cm4gRWxlbWVudC5yZWxhdGl2aXplKGEpfSxyZWFsT2Zmc2V0OkVsZW1lbnQuTWV0aG9kcy5jdW11bGF0aXZlU2Nyb2xsT2Zmc2V0LG9mZnNldFBhcmVudDpFbGVtZW50Lk1ldGhvZHMuZ2V0T2Zmc2V0UGFyZW50LHBhZ2U6RWxlbWVudC5NZXRob2RzLnZpZXdwb3J0T2Zmc2V0LGNsb25lOmZ1bmN0aW9uKGIsYyxhKXthPWF8fHt9O3JldHVybiBFbGVtZW50LmNsb25lUG9zaXRpb24oYyxiLGEpfX07aWYoIWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpe2RvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWU9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShjKXtyZXR1cm4gYy5ibGFuaygpP251bGw6Iltjb250YWlucyhjb25jYXQoJyAnLCBAY2xhc3MsICcgJyksICcgIitjKyIgJyldIn1iLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9UHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5YUGF0aD9mdW5jdGlvbihjLGUpe2U9ZS50b1N0cmluZygpLnN0cmlwKCk7dmFyIGQ9L1xzLy50ZXN0KGUpPyR3KGUpLm1hcChhKS5qb2luKCIiKTphKGUpO3JldHVybiBkP2RvY3VtZW50Ll9nZXRFbGVtZW50c0J5WFBhdGgoIi4vLyoiK2QsYyk6W119OmZ1bmN0aW9uKGUsZil7Zj1mLnRvU3RyaW5nKCkuc3RyaXAoKTt2YXIgZz1bXSxoPSgvXHMvLnRlc3QoZik/JHcoZik6bnVsbCk7aWYoIWgmJiFmKXtyZXR1cm4gZ312YXIgYz0kKGUpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7Zj0iICIrZisiICI7Zm9yKHZhciBkPTAsayxqO2s9Y1tkXTtkKyspe2lmKGsuY2xhc3NOYW1lJiYoaj0iICIray5jbGFzc05hbWUrIiAiKSYmKGouaW5jbHVkZShmKXx8KGgmJmguYWxsKGZ1bmN0aW9uKGkpe3JldHVybiAhaS50b1N0cmluZygpLmJsYW5rKCkmJmouaW5jbHVkZSgiICIraSsiICIpfSkpKSl7Zy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGspKX19cmV0dXJuIGd9O3JldHVybiBmdW5jdGlvbihkLGMpe3JldHVybiAkKGN8fGRvY3VtZW50LmJvZHkpLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZCl9fShFbGVtZW50Lk1ldGhvZHMpfUVsZW1lbnQuQ2xhc3NOYW1lcz1DbGFzcy5jcmVhdGUoKTtFbGVtZW50LkNsYXNzTmFtZXMucHJvdG90eXBlPXtpbml0aWFsaXplOmZ1bmN0aW9uKGEpe3RoaXMuZWxlbWVudD0kKGEpfSxfZWFjaDpmdW5jdGlvbihiLGEpe3RoaXMuZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoL1xzKy8pLnNlbGVjdChmdW5jdGlvbihjKXtyZXR1cm4gYy5sZW5ndGg+MH0pLl9lYWNoKGIsYSl9LHNldDpmdW5jdGlvbihhKXt0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPWF9LGFkZDpmdW5jdGlvbihhKXtpZih0aGlzLmluY2x1ZGUoYSkpe3JldHVybn10aGlzLnNldCgkQSh0aGlzKS5jb25jYXQoYSkuam9pbigiICIpKX0scmVtb3ZlOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmluY2x1ZGUoYSkpe3JldHVybn10aGlzLnNldCgkQSh0aGlzKS53aXRob3V0KGEpLmpvaW4oIiAiKSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuICRBKHRoaXMpLmpvaW4oIiAiKX19O09iamVjdC5leHRlbmQoRWxlbWVudC5DbGFzc05hbWVzLnByb3RvdHlwZSxFbnVtZXJhYmxlKTsoZnVuY3Rpb24oKXt3aW5kb3cuU2VsZWN0b3I9Q2xhc3MuY3JlYXRlKHtpbml0aWFsaXplOmZ1bmN0aW9uKGEpe3RoaXMuZXhwcmVzc2lvbj1hLnN0cmlwKCl9LGZpbmRFbGVtZW50czpmdW5jdGlvbihhKXtyZXR1cm4gUHJvdG90eXBlLlNlbGVjdG9yLnNlbGVjdCh0aGlzLmV4cHJlc3Npb24sYSl9LG1hdGNoOmZ1bmN0aW9uKGEpe3JldHVybiBQcm90b3R5cGUuU2VsZWN0b3IubWF0Y2goYSx0aGlzLmV4cHJlc3Npb24pfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmV4cHJlc3Npb259LGluc3BlY3Q6ZnVuY3Rpb24oKXtyZXR1cm4iIzxTZWxlY3RvcjogIit0aGlzLmV4cHJlc3Npb24rIj4ifX0pO09iamVjdC5leHRlbmQoU2VsZWN0b3Ise21hdGNoRWxlbWVudHM6ZnVuY3Rpb24oZixnKXt2YXIgYT1Qcm90b3R5cGUuU2VsZWN0b3IubWF0Y2gsZD1bXTtmb3IodmFyIGM9MCxlPWYubGVuZ3RoO2M8ZTtjKyspe3ZhciBiPWZbY107aWYoYShiLGcpKXtkLnB1c2goRWxlbWVudC5leHRlbmQoYikpfX1yZXR1cm4gZH0sZmluZEVsZW1lbnQ6ZnVuY3Rpb24oZixnLGIpe2I9Ynx8MDt2YXIgYT0wLGQ7Zm9yKHZhciBjPTAsZT1mLmxlbmd0aDtjPGU7YysrKXtkPWZbY107aWYoUHJvdG90eXBlLlNlbGVjdG9yLm1hdGNoKGQsZykmJmI9PT1hKyspe3JldHVybiBFbGVtZW50LmV4dGVuZChkKX19fSxmaW5kQ2hpbGRFbGVtZW50czpmdW5jdGlvbihiLGMpe3ZhciBhPWMudG9BcnJheSgpLmpvaW4oIiwgIik7cmV0dXJuIFByb3RvdHlwZS5TZWxlY3Rvci5zZWxlY3QoYSxifHxkb2N1bWVudCl9fSl9KSgpOw=="></script>
    <script src="data:text/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIHBybmcuanMKLy8gc2VlZGVkIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvcgovLwovLyB3cml0dGVuIGJ5IGRyb3cgPGRyb3dAYmluLnNoPgovLyBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy8zLjAvCgondXNlIHN0cmljdCc7KChjLGUpPT5lKGMpKSh3aW5kb3csYz0+e2Z1bmN0aW9uIGUoYSl7Yj0xMTAzNTE1MjQ1KmIrMTIzNDU7YiY9MjE0NzQ4MzY0NztyZXR1cm4gMTxhPyhiPj44KSVhOjB9bGV0IGI9RGF0ZS5ub3coKTtjLnNldF9wcm5nX3NlZWQ9ZnVuY3Rpb24oYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKWI9TWF0aC5mbG9vcihhKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgYSl7e3ZhciBkPTQyO2xldCBmO2ZvcihmPTA7ZjxhLmxlbmd0aDtmKyspZD0oZDw8NSktZCthLmNoYXJDb2RlQXQoZiksZCY9MjE0NzQ4MzY0NztiPWR9fWVsc2UgYj1EYXRlLm5vdygpO3JldHVybiBifTtjLnJhbmRvbT1lO2MucmFuZG9tX2ZwPWZ1bmN0aW9uKCl7cmV0dXJuIGUoMzI3NjgpLzMyNzY4fX0pOwo="></script>
    <script src="data:text/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIGRpY2UuanMKLy8KLy8gd3JpdHRlbiBieSBkcm93IDxkcm93QGJpbi5zaD4KLy8gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMvMy4wLwoKJ3VzZSBzdHJpY3QnOygoayxsKT0+bChrKSkod2luZG93LGs9PntmdW5jdGlvbiBsKGEpe2xldCBjPXEoYSk7Yz1wKGMpO2NvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGMpKTtyZXR1cm4gYy5zdHJpbmcucmVwbGFjZSgvXHsoXHcrKVx9L2csKGIsZCk9PmNbZF0udmFsdWUpfWZ1bmN0aW9uIHEoYSl7bGV0IGM9e3N0cmluZzphfTtbe3JlZ2V4Oi8oXGQqKWQoXGQrKS8sZm46KGIsZCxoKT0+e2I9cGFyc2VJbnQoZCwxMCl8fDE7ZD1wYXJzZUludChoLDEwKTt2YXIgZj0xPT1iJiYyMD09ZDtoPW0oKTtsZXQgZT17bjpiLGQsZDIwOmYsdng6W10sc3g6W10sdmFsdWU6MCxyb2xsX2RpZTooKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmUuZCkrMSxmbXRfZGllOmc9PmUuZDIwJiYxPT1nP2A8YiBjbGFzcz0ibWlzcyI+JHtnfTwvYj5gOmUuZDIwJiYyMD09Zz9gPGIgY2xhc3M9ImNyaXQiPiR7Z308L2I+YDoxPT1nfHxnPT1lLmQ/YDxiPiR7Z308L2I+YDpnLHN1bTpnPT5nLnJlZHVjZSgobiwKcik9Pm4rciksZm10X3Bvb2w6Zz0+YCR7ZS5ufWQke2UuZH0gKCR7Zy5qb2luKCIsICIpfSlgfTtmb3IoZD0wO2Q8YjtkKyspZj1lLnJvbGxfZGllKCksZS5zeC5wdXNoKGUuZm10X2RpZShmKSksZS52eC5wdXNoKGYpO2UudmFsdWU9ZS5zdW0oZS52eCk7ZS5zdHI9ZS5mbXRfcG9vbChlLnN4KTtjW2hdPWU7cmV0dXJuYHske2h9fWB9fSx7cmVnZXg6LyhcZCtcLlxkK3xcZCspLyxmbjooYixkKT0+e2I9cGFyc2VGbG9hdChkKTtkPW0oKTtjW2RdPXt2YWx1ZTpiLHN0cjpiLnRvU3RyaW5nKDEwKX07cmV0dXJuYHske2R9fWB9fV0uZm9yRWFjaChiPT57Zm9yKDtiLnJlZ2V4LnRlc3QoYy5zdHJpbmcpOyljLnN0cmluZz1jLnN0cmluZy5yZXBsYWNlKGIucmVnZXgsYi5mbil9KTtyZXR1cm4gY31mdW5jdGlvbiBwKGEpe1t7cmVnZXg6LyhbYS16XSopXCgoW14oKV0rKVwpLyxmbjooYyxiLGQpPT57YS5zdHJpbmc9ZDthPXAoYSk7bGV0IGg9bSgpO2Euc3RyaW5nPWEuc3RyaW5nLnJlcGxhY2UoL1x7KFx3KylcfS8sCihmLGUpPT57Zj1hW2VdO2U9Zi52YWx1ZTt2YXIgZz1gJHtifSgke2Yuc3RyfSlgO2lmKCJhdmciPT1iKWYubiYmZi5kJiYoZT1mLm4qKGYuZCsxKS8yKTtlbHNlIGlmKCJpbnQiPT1iKWU9TWF0aC5mbG9vcihlKTtlbHNlIGlmKCJyb3VuZCI9PWIpZT1NYXRoLmZsb29yKGUrLjUpO2Vsc2UgaWYoInNxcnQiPT1iKWU9TWF0aC5zcXJ0KGUpO2Vsc2UgaWYoKCJhZHYiPT1ifHwiZGlzIj09YikmJmYuZDIwKXtnPWYucm9sbF9kaWUoKTtsZXQgbj1mLmZtdF9kaWUoZyk7ImFkdiI9PWImJmc+Zi52eFswXXx8ImRpcyI9PWImJmc8Zi52eFswXT8oZT1nLGc9Zi5mbXRfcG9vbChbYDxzPiR7Zi5zeFswXX08L3M+YCxuXSkpOmc9Zi5mbXRfcG9vbChbZi5zeFswXSxgPHM+JHtufTwvcz5gXSk7Zz1gJHtifSgke2d9KWB9YVtoXT17dmFsdWU6ZSxzdHI6Z319KTtyZXR1cm5geyR7aH19YH19LHtyZWdleDovXHsoXHcrKVx9XHMqKFwqfFwvfCUpXHMqXHsoXHcrKVx9LyxmbjooYyxiLGQsaCk9PntjPQptKCk7bGV0IGYsZT1gJHthW2JdLnN0cn0gJHtkfSAke2FbaF0uc3RyfWA7IioiPT1kP2Y9YVtiXS52YWx1ZSphW2hdLnZhbHVlOiIvIj09ZD9mPWFbYl0udmFsdWUvYVtoXS52YWx1ZToiJSI9PWQmJihmPWFbYl0udmFsdWUlYVtoXS52YWx1ZSk7YVtjXT17dmFsdWU6ZixzdHI6ZX07cmV0dXJuYHske2N9fWB9fSx7cmVnZXg6L1x7KFx3KylcfVxzKihcK3xcLSlccypceyhcdyspXH0vLGZuOihjLGIsZCxoKT0+e2M9bSgpO2xldCBmLGU9YCR7YVtiXS5zdHJ9ICR7ZH0gJHthW2hdLnN0cn1gOyIrIj09ZD9mPWFbYl0udmFsdWUrYVtoXS52YWx1ZToiLSI9PWQmJihmPWFbYl0udmFsdWUtYVtoXS52YWx1ZSk7YVtjXT17dmFsdWU6ZixzdHI6ZX07cmV0dXJuYHske2N9fWB9fV0uZm9yRWFjaChjPT57Zm9yKDtjLnJlZ2V4LnRlc3QoYS5zdHJpbmcpOylhLnN0cmluZz1hLnN0cmluZy5yZXBsYWNlKGMucmVnZXgsYy5mbil9KTtyZXR1cm4gYX1mdW5jdGlvbiBtKCl7bGV0IGE9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksYz1bXTtmb3IoOzA8YTspYy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoOTcrYSUyNikpLGE9TWF0aC5mbG9vcihhLzI2KTtyZXR1cm4gYy5qb2luKCIiKX1rLnJvbGxfZGljZT1mdW5jdGlvbihhKXtyZXR1cm4gcGFyc2VJbnQobChhKSl9O2sucm9sbF9kaWNlX2ZwPWZ1bmN0aW9uKGEpe3JldHVybiBwYXJzZUZsb2F0KGwoYSkpfTtrLnJvbGxfZGljZV9zdHI9bDtrLnJvbGxfZGljZV9kZXQ9ZnVuY3Rpb24oYSl7bGV0IGM9cShhKTtjPXAoYyk7Y29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYykpO3JldHVybiBjLnN0cmluZy5yZXBsYWNlKC9ceyhcdyspXH0vZywoYixkKT0+e2I9Y1tkXS5zdHI7ZD1jW2RdLnZhbHVlO051bWJlci5pc0ludGVnZXIoZCl8fChkPU1hdGguZmxvb3IoMTAwKmQrLjUpLzEwMCk7cmV0dXJuYDxzcGFuIGNsYXNzPSJzdHIiPiR7Yn08L3NwYW4+ID0gPGI+JHtkfTwvYj5gfSl9fSk7Cg=="></script>
    <script src="data:text/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIGdlbmVyYXRvci5qcwovLwovLyB3cml0dGVuIGJ5IGRyb3cgPGRyb3dAYmluLnNoPgovLyBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy8zLjAvCgondXNlIHN0cmljdCc7ZnVuY3Rpb24gZ2VuZXJhdGVfdGV4dChhKXtpZihhPWdlbl9kYXRhW2FdKWlmKGE9c2VsZWN0X2Zyb20oYSkpe2xldCBjPW5ld190cmFjZSgpO3JldHVybiBleHBhbmRfdG9rZW5zKGEsYyl9cmV0dXJuIiJ9ZnVuY3Rpb24gc2VsZWN0X2Zyb20oYSl7cmV0dXJuIGEuY29uc3RydWN0b3I9PUFycmF5P3NlbGVjdF9mcm9tX2FycmF5KGEpOnNlbGVjdF9mcm9tX3RhYmxlKGEpfWZ1bmN0aW9uIHNlbGVjdF9mcm9tX2FycmF5KGEpe3JldHVybiBhW3JhbmRvbShhLmxlbmd0aCldfWZ1bmN0aW9uIHNlbGVjdF9mcm9tX3RhYmxlKGEpe3ZhciBjO2lmKGM9c2NhbGVfdGFibGUoYSkpe2M9cmFuZG9tKGMpKzE7bGV0IGI7Zm9yKGIgaW4gYSl7bGV0IGQ9a2V5X3JhbmdlKGIpO2lmKGM+PWRbMF0mJmM8PWRbMV0pcmV0dXJuIGFbYl19fXJldHVybiIifQpmdW5jdGlvbiBzY2FsZV90YWJsZShhKXtsZXQgYz0wLGI7Zm9yKGIgaW4gYSlhPWtleV9yYW5nZShiKSxhWzFdPmMmJihjPWFbMV0pO3JldHVybiBjfWZ1bmN0aW9uIGtleV9yYW5nZShhKXtsZXQgYztyZXR1cm4oYz0vKFxkKyktMDAvLmV4ZWMoYSkpP1twYXJzZUludChjWzFdLDEwKSwxMDBdOihjPS8oXGQrKS0oXGQrKS8uZXhlYyhhKSk/W3BhcnNlSW50KGNbMV0sMTApLHBhcnNlSW50KGNbMl0sMTApXToiMDAiPT1hP1sxMDAsMTAwXTpbcGFyc2VJbnQoYSwxMCkscGFyc2VJbnQoYSwxMCldfWZ1bmN0aW9uIG5ld190cmFjZSgpe3JldHVybntleGNsdWRlOnt9LCJ2YXIiOnt9fX1mdW5jdGlvbiBsb2NhbF90cmFjZShhKXtsZXQgYz1PYmplY3QuY2xvbmUoYSk7Y1sidmFyIl09T2JqZWN0LmNsb25lKGFbInZhciJdKTtyZXR1cm4gY30KZnVuY3Rpb24gZXhwYW5kX3Rva2VucyhhLGMpe2xldCBiPS9cJHsgKFtee31dKykgfS87Zm9yKHZhciBkO2Q9Yi5leGVjKGEpOyl7ZD1kWzFdO2xldCBlO2E9KGU9ZXhwYW5kX3Rva2VuKGQsYykpP2EucmVwbGFjZSgiJHsgIitkKyIgfSIsZSk6YS5yZXBsYWNlKCJ7IitkKyJ9IixkKX1yZXR1cm4gYX0KZnVuY3Rpb24gZXhwYW5kX3Rva2VuKGEsYyl7dmFyIGI7bGV0IGQ7cmV0dXJuKGI9L15cZCpkXGQrLy5leGVjKGEpKXx8KGI9L15jYWxjICguKykvLmV4ZWMoYSkpP3JvbGxfZGljZV9zdHIoYlsxXSk6KGI9L14oXGQrKSB4ICguKykvLmV4ZWMoYSkpP2V4cGFuZF94KGJbMV0sYlsyXSxjKTooYj0vXlxbICguKykgXF0vLmV4ZWMoYSkpPyhiPWJbMV0uc3BsaXQoLyxccyovKSxleHBhbmRfdG9rZW5zKHNlbGVjdF9mcm9tX2FycmF5KGIpLGMpKTooZD1nZW5fZGF0YVthXSk/ZXhwYW5kX3Rva2VucyhzZWxlY3RfZnJvbShkKSxjKTooYj0vXmFsdCAoLispIGRlZiAoLispLy5leGVjKGEpKT8oZD1nZW5fZGF0YVtiWzFdXSk/ZXhwYW5kX3Rva2VucyhzZWxlY3RfZnJvbShkKSxjKTooZD1nZW5fZGF0YVtiWzJdXSk/ZXhwYW5kX3Rva2VucyhzZWxlY3RfZnJvbShkKSxjKTpiWzJdOihiPS9edW5pcXVlICguKykvLmV4ZWMoYSkpP2V4cGFuZF91bmlxdWUoYlsxXSxjKTooYj0vXmxvY2FsICguKykvLmV4ZWMoYSkpPwooYz1sb2NhbF90cmFjZShjKSxleHBhbmRfdG9rZW4oYlsxXSxjKSk6KGI9L15uZXcgKC4rKS8uZXhlYyhhKSk/KGM9bmV3X3RyYWNlKCksZXhwYW5kX3Rva2VuKGJbMV0sYykpOihiPS9ec2V0IChcdyspID0gKC4rPykgaW4gKC4rKS8uZXhlYyhhKSk/KGNbInZhciJdW2JbMV1dPWJbMl0sZXhwYW5kX3Rva2VuKGJbM10sYykpOihiPS9ec2V0IChcdyspID0gKC4rKS8uZXhlYyhhKSk/c2V0X3ZhcihiWzFdLGJbMl0sYyk6KGI9L15nZXQgKFx3KykgZGVmICguKykvLmV4ZWMoYSkpP2NbInZhciJdW2JbMV1dfHxiWzJdOihiPS9eZ2V0IChcdyspIGZpeCAoLispLy5leGVjKGEpKT9jWyJ2YXIiXVtiWzFdXXx8c2V0X3ZhcihiWzFdLGJbMl0sYyk6KGI9L15nZXQgKFx3KykvLmV4ZWMoYSkpP2NbInZhciJdW2JbMV1dOihiPS9ec2hpZnQgKFx3KykgPSAoLispLy5leGVjKGEpKT8oY1sidmFyIl1bYlsxXV09YlsyXS5zcGxpdCgvLFxzKi8pLGNbInZhciJdW2JbMV1dLnNoaWZ0KCkpOihiPS9ec2hpZnQgKFx3KykvLmV4ZWMoYSkpPwpjWyJ2YXIiXVtiWzFdXS5zaGlmdCgpOihiPS9eYW4gKC4rKS8uZXhlYyhhKSk/YW9yYW4oZXhwYW5kX3Rva2VuKGJbMV0sYykpOihiPS9eQW4gKC4rKS8uZXhlYyhhKSk/dWNmaXJzdChhb3JhbihleHBhbmRfdG9rZW4oYlsxXSxjKSkpOihiPS9ebnQgKC4rKS8uZXhlYyhhKSk/bm90aGUoZXhwYW5kX3Rva2VuKGJbMV0sYykpOihiPS9ebGMgKC4rKS8uZXhlYyhhKSk/bGMoZXhwYW5kX3Rva2VuKGJbMV0sYykpOihiPS9ebGYgKC4rKS8uZXhlYyhhKSk/aW5saW5lX2Nhc2UoZXhwYW5kX3Rva2VuKGJbMV0sYykpOihiPS9ebHQgKC4rKS8uZXhlYyhhKSk/bHRoZShleHBhbmRfdG9rZW4oYlsxXSxjKSk6KGI9L151YyAoLispLy5leGVjKGEpKT91YyhleHBhbmRfdG9rZW4oYlsxXSxjKSk6KGI9L151ZiAoLispLy5leGVjKGEpKT91Y2ZpcnN0KGV4cGFuZF90b2tlbihiWzFdLGMpKTooYj0vXnNjICguKykvLmV4ZWMoYSkpP3VjZmlyc3QobGMoZXhwYW5kX3Rva2VuKGJbMV0sYykpKTooYj0KL150YyAoLispLy5leGVjKGEpKT90aXRsZV9jYXNlKGV4cGFuZF90b2tlbihiWzFdLGMpKTooYj0vXmdlbl9uYW1lICguKykvLmV4ZWMoYSkpPyhiPWJbMV0ucmVwbGFjZSgvLC4qLywiIiksZ2VuZXJhdGVfbmFtZShiKSk6YX0KZnVuY3Rpb24gZXhwYW5kX3goYSxjLGIpe2xldCBkPXt9LGU9e30sZj1bXSxsPWIuY29tbWF8fCIsICI7Zm9yKDttYXRjaD0vXihhbmR8bGl0ZXJhbHx1bmlxdWUpICguKykvLmV4ZWMoYyk7KWRbbWF0Y2hbMV1dPSEwLGM9bWF0Y2hbMl07bGV0IGs7Zm9yKGs9MDtrPGE7aysrKXt2YXIgZz1uZXcgU3RyaW5nKGMpO2c9ZC51bmlxdWU/ZXhwYW5kX3VuaXF1ZShnLGIpOmV4cGFuZF90b2tlbihnLGIpO2QubGl0ZXJhbD9mLnB1c2goZyk6KG1hdGNoPS9eKFxkKykgeCAoLispLy5leGVjKGcpKT9lW21hdGNoWzJdXSs9cGFyc2VJbnQobWF0Y2hbMV0sMTApOmVbZ10rPTF9JEgoZSkua2V5cygpLnNvcnQoKS5mb3JFYWNoKGg9PnsxPGVbaF0/Zi5wdXNoKFtlW2hdLGhdLmpvaW4oIiB4ICIpKTpmLnB1c2goaCl9KTtyZXR1cm4gZC5hbmQ/KGE9Zi5wb3AoKSxmLmxlbmd0aD9bZi5qb2luKGwpLGFdLmpvaW4oIiBhbmQgIik6YSk6Zi5qb2luKGwpfQpmdW5jdGlvbiBleHBhbmRfdW5pcXVlKGEsYyl7bGV0IGI7Zm9yKGI9MDsxMDA+YjtiKyspe2xldCBkPWV4cGFuZF90b2tlbihhLGMpO2lmKCFjLmV4Y2x1ZGVbZF0pcmV0dXJuIGMuZXhjbHVkZVtkXT0hMCxkfXJldHVybiIifWZ1bmN0aW9uIHNldF92YXIoYSxjLGIpe2lmKCJucGNfbmFtZSI9PWEpe2xldCBkOyhkPS9eKC4rPykgLisvLmV4ZWMoYykpP2JbInZhciJdLm5hbWU9ZFsxXTpiWyJ2YXIiXS5uYW1lPWN9cmV0dXJuIGJbInZhciJdW2FdPWN9CmZ1bmN0aW9uIGFvcmFuKGEpe3JldHVybi9edGhlIC9pLnRlc3QoYSk/YTovXihudW5jaGFrdSkvaS50ZXN0KGEpP2E6L14odW5pY29ybnx1bmlxdWV8dW5pdmVyc2l0eSkvaS50ZXN0KGEpP2BhICR7YX1gOi9eKGhvdXIpL2kudGVzdChhKT9gYW4gJHthfWA6L15bQkNER0pLUFFUVVZXWVpdW0EtWjAtOV0rLy50ZXN0KGEpP2BhICR7YX1gOi9eW0FFRkhJTE1OT1JTWF1bQS1aMC05XSsvLnRlc3QoYSk/YGFuICR7YX1gOi9eW2FlaW91XS9pLnRlc3QoYSk/YGFuICR7YX1gOmBhICR7YX1gfWZ1bmN0aW9uIG5vdGhlKGEpe2xldCBjO3JldHVybihjPS9edGhlICguKykvaS5leGVjKGEpKT9jWzFdOmF9ZnVuY3Rpb24gbGMoYSl7cmV0dXJuIGEudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBsY2ZpcnN0KGEpe2xldCBjO3JldHVybihjPS9eKFthLXpdKSguKikvaS5leGVjKGEpKT9sYyhjWzFdKStjWzJdOmF9CmZ1bmN0aW9uIGlubGluZV9jYXNlKGEpe3JldHVybi9eW0EtWl1bQS1aXS8udGVzdChhKT9hOmxjZmlyc3QoYSl9ZnVuY3Rpb24gbHRoZShhKXtsZXQgYztyZXR1cm4oYz0vXnRoZSAoLispL2kuZXhlYyhhKSk/YHRoZSAke2NbMV19YDphfWZ1bmN0aW9uIHVjKGEpe3JldHVybiBhLnRvVXBwZXJDYXNlKCl9ZnVuY3Rpb24gdWNmaXJzdChhKXtsZXQgYztyZXR1cm4oYz0vXihbYS16XSkoLiopL2kuZXhlYyhhKSk/dWMoY1sxXSkrY1syXTphfWZ1bmN0aW9uIHRpdGxlX2Nhc2UoYSl7cmV0dXJuIGEuc3BsaXQoL1xzKy8pLm1hcCh1Yykuam9pbigiICIpfTsK"></script>
    <script src="data:text/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIG5hbWUuanMKLy8KLy8gd3JpdHRlbiBieSBkcm93IDxkcm93QGJpbi5zaD4KLy8gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMvMy4wLwoKJ3VzZSBzdHJpY3QnO2xldCBjaGFpbl9jYWNoZT17fTtmdW5jdGlvbiBnZW5lcmF0ZV9uYW1lKGIpe2xldCBhO3JldHVybihhPW1hcmtvdl9jaGFpbihiKSk/bWFya292X25hbWUoYSk6IiJ9ZnVuY3Rpb24gbWFya292X2NoYWluKGIpe3ZhciBhO2lmKGE9Y2hhaW5fY2FjaGVbYl0pcmV0dXJuIGE7aWYoYT1uYW1lX3NldFtiXSlpZihhPWNvbnN0cnVjdF9jaGFpbihhKSlyZXR1cm4gY2hhaW5fY2FjaGVbYl09YTtyZXR1cm4hMX0KZnVuY3Rpb24gY29uc3RydWN0X2NoYWluKGIpe2xldCBhPXt9LGM7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyl7bGV0IGc9YltjXS5zcGxpdCgvXHMrLyk7YT1pbmNyX2NoYWluKGEsInBhcnRzIixnLmxlbmd0aCk7bGV0IGY7Zm9yKGY9MDtmPGcubGVuZ3RoO2YrKyl7dmFyIGQ9Z1tmXTthPWluY3JfY2hhaW4oYSwibmFtZV9sZW4iLGQubGVuZ3RoKTt2YXIgZT1kLnN1YnN0cigwLDEpO2E9aW5jcl9jaGFpbihhLCJpbml0aWFsIixlKTtmb3IoZD1kLnN1YnN0cigxKTswPGQubGVuZ3RoOyl7bGV0IGg9ZC5zdWJzdHIoMCwxKTthPWluY3JfY2hhaW4oYSxlLGgpO2Q9ZC5zdWJzdHIoMSk7ZT1ofX19cmV0dXJuIHNjYWxlX2NoYWluKGEpfWZ1bmN0aW9uIGluY3JfY2hhaW4oYixhLGMpe2JbYV0/YlthXVtjXT9iW2FdW2NdKys6YlthXVtjXT0xOihiW2FdPXt9LGJbYV1bY109MSk7cmV0dXJuIGJ9CmZ1bmN0aW9uIHNjYWxlX2NoYWluKGIpe2xldCBhPXt9O09iamVjdC5rZXlzKGIpLmZvckVhY2goYz0+e2FbY109MDtPYmplY3Qua2V5cyhiW2NdKS5mb3JFYWNoKGQ9PntsZXQgZT1NYXRoLmZsb29yKE1hdGgucG93KGJbY11bZF0sMS4zKSk7YltjXVtkXT1lO2FbY10rPWV9KX0pO2IudGFibGVfbGVuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gbWFya292X25hbWUoYil7bGV0IGE9c2VsZWN0X2xpbmsoYiwicGFydHMiKSxjPVtdLGQ7Zm9yKGQ9MDtkPGE7ZCsrKXtsZXQgZz1zZWxlY3RfbGluayhiLCJuYW1lX2xlbiIpO3ZhciBlPXNlbGVjdF9saW5rKGIsImluaXRpYWwiKTtsZXQgZj1lO2Zvcig7Zi5sZW5ndGg8ZzspZT1zZWxlY3RfbGluayhiLGUpLGYrPWU7Yy5wdXNoKGYpfXJldHVybiBjLmpvaW4oIiAiKX0KZnVuY3Rpb24gc2VsZWN0X2xpbmsoYixhKXtsZXQgYz1yYW5kb20oYi50YWJsZV9sZW5bYV0pLGQ9MDtyZXR1cm4gT2JqZWN0LmtleXMoYlthXSkuZmlsdGVyKGU9PntkKz1iW2FdW2VdO3JldHVybiBjPGR9KVswXX07Cg=="></script>
    <script src="data:text/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIGR1bmdlb24vZ2VuX2RhdGEuanMKLy8KLy8gd3JpdHRlbiBieSBkcm93IDxkcm93QGJpbi5zaD4KLy8gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMvMy4wLwoKJ3VzZSBzdHJpY3QnO2xldCBnZW5fZGF0YT17IkR1bmdlb24gTmFtZSI6WyJUaGUgJHsgRHVuZ2VvbiBUeXBlIH0gb2YgJHsgRGlyZSBIb3Jyb3IgfSAkeyBEdW5nZW9uIEhvcnJvciB9IiwiVGhlICR7IExvc3QgRHVuZ2VvbiB9ICR7IER1bmdlb24gVHlwZSB9IG9mICR7IER1bmdlb24gSG9ycm9yIH0iLCJUaGUgJHsgRHVuZ2VvbiBUeXBlIH0gb2YgJHsgbHQgVGhlIERhcmtsb3JkIH0iLCJUaGUgJHsgTG9zdCBEdW5nZW9uIH0gJHsgRHVuZ2VvbiBUeXBlIH0gb2YgJHsgbHQgVGhlIERhcmtsb3JkIH0iXSwiTG9zdCBEdW5nZW9uIjoiQmxhY2sgRGFyayBEcmVhZCBGb3JzYWtlbiBMb3N0IFNlY3JldCIuc3BsaXQoIiAiKSwiRHVuZ2VvbiBUeXBlIjoiQmFycm93IENhdGFjb21icyBDYXZlcm5zIENoYW1iZXJzIENyeXB0cyBDeXN0IERlbHZlIER1bmdlb24gR2F1bnRsZXQgSGFsbHMgSGl2ZSBMYWJ5cmludGggTGFpciBQaXQgUHJpc29uIFNhbmN0dW0gU2VwdWxjaGVyIFNocmluZSBUZW1wbGUgVG9tYiBUdW5uZWxzIFVuZGVyY3J5cHQgVmF1bHRzIFdhcnJlbnMiLnNwbGl0KCIgIiksCiJEaXJlIEhvcnJvciI6IiR7IEJsb29keSBFcGl0aGV0IH07JHsgRGFyayBFcGl0aGV0IH07JHsgRGlyZSBFcGl0aGV0IH07JHsgRWxkcml0Y2ggRXBpdGhldCB9OyR7IEZpZW5kaXNoIEVwaXRoZXQgfTskeyBNaWdodHkgRXBpdGhldCB9Ii5zcGxpdCgiOyIpLCJCbG9vZHkgRXBpdGhldCI6WyJCbG9vZHkiLCJDcmltc29uIiwiR2hhc3RseSIsIkdydWVzb21lIl0sIkRhcmsgRXBpdGhldCI6IkFwaG90aWMgQmxhY2sgRGFyayBEaXNtYWwgR2xvb215IFRlbmVicm91cyBTaGFkb3d5IFN1bmxlc3MiLnNwbGl0KCIgIiksIkRpcmUgRXBpdGhldCI6IkJhbGVmdWwgQ3J1ZWwgRGlyZSBHcmltIEhvcnJlbmRvdXMgTWVyY2lsZXNzIFBvaXNvbm91cyBTaW5pc3RlciBUcmVhY2hlcm91cyBVbnNwZWFrYWJsZSBXb2VmdWwiLnNwbGl0KCIgIiksIkVsZHJpdGNoIEVwaXRoZXQiOiJBcmNhbmUgRGVtb25pYyBFbGRyaXRjaCBFbGVtZW50YWwgRmllbmRpc2ggSW5mZXJuYWwgVW5lYXJ0aGx5Ii5zcGxpdCgiICIpLAoiRmllbmRpc2ggRXBpdGhldCI6IkFieXNzYWwgQWNjdXJzZWQgQmFhdG9yaWFuIEJsYWNrIENvcnJ1cHQgRGFtbmVkIERlbW9uaWMgRmFsbGVuIEZlbGwgRmllbmRpc2ggSGVsbGlzaCBNYWxlZmljIE1hbGV2b2xlbnQgTWFsaWduIFByb2ZhbmUgVmlsZSBXaWNrZWQiLnNwbGl0KCIgIiksIk1pZ2h0eSBFcGl0aGV0IjpbIkFkYW1hbnQiLCJBd2Vzb21lIiwiSW5kb21pdGFibGUiLCJNaWdodHkiLCJUZXJyaWJsZSJdLCJEdW5nZW9uIEhvcnJvciI6IkFnZXMgQW5uaWhpbGF0aW9uIENoYW9zIERlYXRoIERldmFzdGF0aW9uIERvb20gRXZpbCBIb3Jyb3IgTWFkbmVzcyBNYWxpY2UgTmVjcm9tYW5jeSBOaWdodG1hcmVzIFJ1aW4gU2VjcmV0cyBTb3Jyb3dzIFNvdWxzIFRlcnJvciBXb2UgV29ybXMiLnNwbGl0KCIgIiksIlRoZSBEYXJrbG9yZCI6WyIkeyBOYW1lZCBEYXJrbG9yZCB9IiwiJHsgRGFya2xvcmQgTmFtZSB9IiwiJHsgRGFya2xvcmQgTmFtZSB9IHRoZSAkeyBEYXJrbG9yZCBFcGl0aGV0IH0iLAoiVGhlICR7IE1vbnN0ZXIgRXBpdGhldCB9ICR7IE5vYmxlIFRpdGxlIH0iXSwiTmFtZWQgRGFya2xvcmQiOiJFbWlya29sIHRoZSBDaGFvdGljO0dvdGhtb2cgb2YgVWR1bjtLYXMgdGhlIEJsb29keTtLYXMgdGhlIEJldHJheWVyO0xvcmQgR3JleXd1bGY7TWFyY2VsaW5lIHRoZSBWYW1waXJlIFF1ZWVuO1NoaXZhIHRoZSBEZXN0cm95ZXI7VGhlIEdvYmxpbiBLaW5nO1VsZmFuZyB0aGUgQmxhY2s7WmVpcmFtIHRoZSBMaWNoIi5zcGxpdCgiOyIpLCJEYXJrbG9yZCBOYW1lIjpbIiR7IGdlbl9uYW1lIERyYWNvbmljIH0iLCIkeyBnZW5fbmFtZSBHb3RoaWMgfSIsIiR7IGdlbl9uYW1lIEZpZW5kaXNoIH0iXSwiRGFya2xvcmQgRXBpdGhldCI6IiR7IEJsb29keSBFcGl0aGV0IH07JHsgRGlyZSBFcGl0aGV0IH07JHsgRWxkcml0Y2ggRXBpdGhldCB9OyR7IEZpZW5kaXNoIEVwaXRoZXQgfTskeyBJbnNhbmUgRXBpdGhldCB9OyR7IE1pZ2h0eSBFcGl0aGV0IH07JHsgRGFya21hZ2UgfSIuc3BsaXQoIjsiKSwKIkluc2FuZSBFcGl0aGV0IjpbIkRlcmFuZ2VkIiwiSW5zYW5lIiwiTHVuYXRpYyIsIk1hZCIsIlBvc3Nlc3NlZCJdLERhcmttYWdlOiJBcmNobWFnZSBFbmNoYW50cmVzcyBOZWNyb21hbmNlciBQb250aWZleCBTb3JjZXJvciBXYXJsb2NrIFdpdGNoIi5zcGxpdCgiICIpLCJNb25zdGVyIEVwaXRoZXQiOiJEZW1vbiBHYXJnb3lsZSBMaWNoIFNoYWRvdyBWYW1waXJlIFdyYWl0aCBXeXJtIi5zcGxpdCgiICIpLCJOb2JsZSBUaXRsZSI6IkJhcm9uIENvdW50IER1a2UgS25pZ2h0IExvcmQgV2FybG9yZCBCYXJvbmVzcyBDb3VudGVzcyBEdWNoZXNzIEtuaWdodCBFbXBlcm9yIEtpbmcgUHJpbmNlIFR5cmFudCBFbXByZXNzIFByaW5jZXNzIFF1ZWVuIi5zcGxpdCgiICIpfTsK"></script>
    <script src="data:text/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIGR1bmdlb24vbmFtZV9zZXQuanMKLy8KLy8gd3JpdHRlbiBieSBkcm93IDxkcm93QGJpbi5zaD4KLy8gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMvMy4wLwoKJ3VzZSBzdHJpY3QnO2xldCBuYW1lX3NldD17RHJhY29uaWM6IkFiZGkgQWJpZGl0YWFuIEFiaWVzdXVoIEFtbWlkaXRhbmEgQW1taXNhZHVrYSBBbXVycnUgQXBpbHNpbiBBcmFtbWFkYXJhIEFyc2FjZXMgQXNtYWR1IEJhbHNoYXp6YXIgQmVyb3NzdXMgQmhoYXp1dW0gQnVybmFidXJpYXNoIERhYWQgRGl0YW51IEdlemVyIEhlYW5hIElibmkgSWxpbWEgSXB0aXlhbXV0YSBLYWRhc2htYW4gS2hlYmEgTWFhbSBNaWxraWx1IE5hYm9uaWR1cyBOYWJ1bmFpZCBOYWJ1cG9sYXNzYXIgTmFtaHV1IE5hbXp1dSBOZWJ1Y2hhZG5lenplciBOaW51cyBOaW55YXMgT2JhcmVzIFNhYW1zdWlsdW5hIFNoZXNoYmF6emFyIFNpbm11YmFsaWl0IFN1bWFsaWthIFN1bXVsYSBTdW5pIFRhdHRlbmFpIFR1dWJ0aXlhbXV0YSBZYWFta3V1enp1aGFsYW1tYSBaYWJpdW0gWnV1bW1hYnUgQWJpZXNoYSBBbW1pc2FkdWdhIEFudW5uYWtpIEF0cmFoYXJzaXMgQmFhbCBCZWwgQmVsc2hpbW1hbm5pIEJpbGl0IERhZ29uIERhbXV6aSBFbmtpIEVubGlsIEVubWVya2FyIEdpbGdhbWVzaCBHdWRlYSBIYW1tdXJhYmkgS3VyIE1hcmR1ayBNaWxpdCBOZXJnYWwgTmluYXp1IE5pbmdpcnN1IFNhYml1bSBTYW1zdWRpdGFuYSBTYW11Z2FuIFNhbmd1c3UgU2h1bGxhdCBTaW4gU3VtdWFidW0gU3VtdWxhZWwgVXR1Ii5zcGxpdCgiICIpLApGaWVuZGlzaDoiQWJhZGRvbiBBYmFsYW0gQWJyYXhhcyBBYnl6b3UgQWRyYW1lbGVjaCBBZXNobWEgQWdhcmVzIEFocmltYW4gQWt2YW4gQWxsb2NlcyBBbW9uIEFuYW1hbGVjaCBBbmRoYWthIEFuenUgQXJtYXJvcyBBc2Fra3UgQXN0YXJvdGggQmFlbCBCYWxiZXJpdGggQmFwaG9tZXQgQmFyYmF0b3MgQmVoZW1vdGggQmVsZXRoIEJlbHBoZWdvciBDaGFydW4gQ2hlbW9zaCBDdWxzdSBEYWdvbiBEcmVrYXZhYyBFYmxpcyBFbGlnb3MgRXVyeWFsZSBGb2NhbG9yIEZvcm5ldXMgR2FkZXJlbCBHYWtpIEdhbWlnaW4gR2xhc3lhIEdvbW9yeSBHdXNveW4gSGFscGhhcyBIYXVyZXMgSWJsaXMgS2FsaSBLYXNhZHlhIEtpbWFyaXMgTGFtYXNodHUgTGVjaGllcyBMZXJhaWUgTGlsaXRoIE1hbGFwaGFyIE1hbHBoYXMgTWFsdGh1cyBNYW1tb24gTWFyYSBNYXJiYXMgTWFyaWNoYSBNYXN0ZW1hIE1lbGNoaXJlc2EgTWVwaGlzdG9waGVsZXMgTWVyaWhlbSBNb2xvY2ggTmFiZXJ1cyBOYXBodWxhIE5pbnVydGEgT3JpYXggT3JvYm9zIFBhenV6dSBQaGVuZXggUHJ1c2xhcyBSYWtzaGFzYSBSYXVtIFJ1bXlhbCBTYWxlb3MgU2FtYWVsIFNlbXlheiBTaGVkaW0gU3RoZW5ubyBTdXJnYXQgVWtvYmFjaCBWYWxhYyBWYXB1bGEgVmFzc2FnbyBWZXBhciBWZXBoYXIgWGFwaGFuIFlldGVyZWwgWmFnYW4gWmVwYXIiLnNwbGl0KCIgIiksCkdvdGhpYzoiQWJsYWJpdXMgQWNoaWxhIEFnaWxhIEFnaXd1bGYgQWdyaXd1bGYgQWlkb2luZ3VzIEFpdGhhbmFyaWQgQWxhcmljIEFsYXRoZXVzIEFsYXZpdiBBbGljYSBBbGlnZXJuIEFsbGEgQW1hbCBBbWFsYXJpYyBBbW1pdXMgQW5hZ2FzdGVzIEFuZGFnaXMgQW5pYW51cyBBbnNpbGEgQW5zaXMgQW9yaWMgQXBhaGlkYSBBcmRhYnVyIEFyZGFyaWMgQXJnYWl0aCBBcmlhcmljIEFyaW1pciBBcml1cyBBcm5lZ2xpc2N1cyBBcnZhbmR1cyBBc2JhZCBBc3BhciBBdGF1bGYgQXRhdWxwaCBBdGhhbGFyaWMgQXRoYW5hZ2lsZCBBdGhhbmFyaWMgQXRoYXJpZCBBdGhhdWxmIEJhYmFpIEJhZHVhIEJhZHVpbGEgQmF6YSBCZXJpZyBCZXJpbXVkIEJlcmltdW5kIEJlc3NhIEJlc3NhcyBCZXNzaSBCZXVjYSBCZXVjYWQgQmlnZWxpcyBCaWxpbWVyIEJvcmFuaSBCcmFnYSBCcmFuZGlsYSBDYW5kYWMgQ2FubmFiYXMgQ2FubmFiYXVkZXMgQ2V0aGVndXMgQ2hpbmRhc3VpbnRoIENuaXZhIENuaXZpZGEgQ29saWFzIENyb2N1cyBDdW5pZ2FzdCBDdW5pbXVuZCBDeXJpbGEgRHViaXVzIER1ZGEgRWJlcm11ZCBFYmVyd29sZiBFYnJpbXVkIEVkaWNhIEVyYXJpYyBFcml1bGYgRXJtYW5hcmljIEVybWVsYW5kdXMgRXJ2aWcgRXVyaWMgRXV0aGFyaWMgRmFybm9iaXVzIEZhc3RpZGEgRmVsZXRoZXVzIEZldmEgRmlsaW1lciBGbGFjY2l0aGV1cyBGcmF2aXR0YSBGcmVkZWdhciBGcmV0ZWxhIEZyaWRlcmljIEZyaWRpZ2VybiBGcmlnZXJpZHVzIEZyaXRoaWxhIEZyaXRpZ2VybiBHYWRhcmljIEdhaW5hcyBHYWlzZXJpYyBHYWxpbmRvIEdhbGluZHVzIEdhdXQgR2F1dGVyaXQgR2ViZXJpYyBHZWxpbWVyIEdlbnRvIEdlcnVuZyBHZXNhbGVjIEdlc2ltdW5kIEdldGljYSBHb2FyIEdvZGRhcyBHb2RlZ2lzZWwgR29kaWdpc2NsdXMgR29pYXJpY3VzIEdvdXRodGhhcyBHdW5kZWhhciBHdW5kaW9rIEd1bmRvYmFkIEd1bnRlcmljIEd1bnRoaWdpcyBHdXR0aGlrYXMgSGFkdWJyYW5kIEhlbGRlYmFsZCBIZWxkZWZyZWR1cyBIZXJpYnJhbmQgSGVybWFuZ2lsZCBIZXJtZW5pZ2lsZCBIZXJtaW5hZnJpZCBIZXJuZWdsaXNjdXMgSGlsZGViYWQgSGlsZGVicmFuZCBIaWxkZXJpYyBIaWxkZXJpdGggSGltbmVyaXRoIEhpc2FybmEgSHVsbXVsIEh1bWwgSHVuZXJpYyBIdW5pZ2lsZCBIdW5pbXVuZCBIdW51bGYgSHVudW11bmQgSWJiYSBJbGRlYmFkIElubmEgSXJuZnJpZWQgSm9yZGFuZXMgTGFnYXJpbWFuIExhbXByaWRpdXMgTGVvdmlnaWxkIExldXZpYmlsZCBMaXZpbGEgTWFyY29taXIgTW9kYWhhcml1cyBNb2RhcmVzIE11bmRlcmljIE11bmRvIE5hbWF0aXVzIE5hdWxhYmF0ZXMgTmlkYWRhIE5pa2V0YXMgT2RvaW4gT2RvdGhldXMgT2RvdmFjYXIgT3N0cm9nb3RoYSBPc3VpbiBPdmlkYSBQYXR6YSBSYWRhZ2Fpc3VzIFJhdXNpbW9kIFJlY2FyZWQgUmVjY2FyZWQgUmVjY2Vzd2ludGggUmVjaGlhciBSZWNoaW11bmQgUmVjaXRhY2ggUmVraXRhY2ggUmVtaXNtdW5kIFJlc3BhIFJldGVtZXJpcyBSaGltYSBSaWNpbWVyIFJpY3Rpb3ZhcnVzIFJpa2lhciBSb2RlcmljIFJvZG9sZiBSb2R1dWxmIFJ1ZGVzaW5kIFNhYmEgU2FkYWdhcmVzIFNhZnJheCBTYWxsYSBTYW5naWJhbiBTYW5zYWxhcyBTYXBocmF4IFNhcnVzIFNlZ2VyaWMgU2VsZW5hcyBTaGFwdXIgU2lkaW11bmQgU2lnZXJpYyBTaWdlc2FyIFNpZ2liYWxkIFNpZ2lzbXVuZCBTaWdpc3Z1bHQgU2luZGlsYSBTaXNiZXJ0IFNpc2VidXQgU2lzZW5hbmQgU29hcyBTdWF0cml1cyBTdWVyaWR1cyBTdW5lcmljdXMgU3VubmlhIFRhbmFpcyBUYW5jYSBUZWlhcyBUZWphIFRoYXJ1YXJvIFRoZWxhIFRoZW9kYWhhZCBUaGVvZGVoYWQgVGhlb2RlbWVyIFRoZW9kZXJpYyBUaGVvZGVyaWQgVGhlb2RvcmljIFRoZW9kdWxmIFRoZXVkZWdpc2VsIFRoZXVkZWdpc2tsb3MgVGhldWRpcyBUaGlkcmVrIFRoaXVkaW1pciBUaG9yaXNtdWQgVGhvcmlzbXVuZCBUaHJhc2FtdW5kIFRocmFzYXJpYyBUaHJhdXN0aWxhIFRvdGlsYSBUcmliaWdpbGQgVHVmYSBUdWx1aW4gVWxmaWxhcyBVbmlnaWxkIFVuaWxhIFVuaW11bmQgVXJhaWFzIFZhbGFtZXIgVmFsYW1pciBWYWxhcmF2YW5zIFZhbGlhIFZhbmRhbGFyaXVzIFZhbmRpbCBWZWR1Y28gVmV0ZXJpY3VzIFZldHJhbmlvIFZpZGVyaWMgVmlkaWdvaWEgVmlkaW1pciBWaWxpYXJpcyBWaW5pdGhhcml1cyBWaXNpbWFyIFZpdGhpbWlyaXMgVml0aG1pcmlzIFZpdGlnaXMgVml0dGFtYXIgVnVsdHV1bGYgV2FsYSBXYWxhaG1hciBXYWxsaWEgV2FtYmEgV2VsbGEgV2luZ3VyaWMgV2l0aWdlIFdpdHRpZ2lzIFdpdHRpemEiLnNwbGl0KCIgIil9Owo="></script>
    <script src="data:text/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIGNhbnZhcy5qcwovLwovLyB3cml0dGVuIGJ5IGRyb3cgPGRyb3dAYmluLnNoPgovLyBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy8zLjAvCgondXNlIHN0cmljdCc7KChnLGwpPT5sKGcpKSh3aW5kb3csZz0+e2Z1bmN0aW9uIGwoYSxjLGIpe2xldCBkPSIjIitbKCIwMCIrYS50b1N0cmluZygxNikpLnN1YnN0cigtMiksKCIwMCIrYy50b1N0cmluZygxNikpLnN1YnN0cigtMiksKCIwMCIrYi50b1N0cmluZygxNikpLnN1YnN0cigtMildLmpvaW4oIiIpO21bZF09W2EsYyxiLDI1NV07cmV0dXJuIGR9ZnVuY3Rpb24gcShhKXtpZihtW2FdKXJldHVybiBtW2FdO3tsZXQgYjt2YXIgYz0oYj0vXiMoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkvaS5leGVjKGEpKXx8KGI9L14jKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pL2kuZXhlYyhhKSk/W3BhcnNlSW50KGJbMV0sMTYpLHBhcnNlSW50KGJbMl0sMTYpLHBhcnNlSW50KGJbM10sMTYpLDI1NV06KGI9L15yZ2JbKF0oXGQrKSwoXGQrKSwoXGQrKVspXS9pLmV4ZWMoYSkpP1twYXJzZUludChiWzFdLDEwKSxwYXJzZUludChiWzJdLDEwKSxwYXJzZUludChiWzNdLAoxMCksMjU1XTohMX1yZXR1cm4gYz9tW2FdPWM6WzAsMCwwLDI1NV19ZnVuY3Rpb24gcihhKXtsZXQgYz1hWzBdO3ZhciBiPWFbMl0vMTAwO2E9YVsxXS8xMDAqYjtsZXQgZD1hKigxLU1hdGguYWJzKGMvNjAlMi0xKSk7Yi09YTtsZXQgZT0wLGY9MCxoPTA7NjA+Yz8oZT1hLGY9ZCk6MTIwPmM/KGU9ZCxmPWEpOjE4MD5jPyhmPWEsaD1kKToyNDA+Yz8oZj1kLGg9YSk6MzAwPmM/KGU9ZCxoPWEpOihlPWEsaD1kKTtlPU1hdGgubWluKE1hdGgubWF4KE1hdGguZmxvb3IoMjU1KihlK2IpKSwwKSwyNTUpO2Y9TWF0aC5taW4oTWF0aC5tYXgoTWF0aC5mbG9vcigyNTUqKGYrYikpLDApLDI1NSk7aD1NYXRoLm1pbihNYXRoLm1heChNYXRoLmZsb29yKDI1NSooaCtiKSksMCksMjU1KTtyZXR1cm5bZSxmLGhdfWZ1bmN0aW9uIHQoYSxjLGIsZCl7bj9rW2RdP2tbZF0ucHVzaChbYyxiXSk6a1tkXT1bW2MsYl1dOnAoYSxjLGIsYyxiLGQpfWZ1bmN0aW9uIHAoYSxjLGIsZCxlLGYpe2EuZmlsbFN0eWxlPQpmO2EuZmlsbFJlY3QoYyxiLGQtYysxLGUtYisxKX1sZXQgbT17fSxuPSExLGs9e307Zy5uZXdfaW1hZ2U9ZnVuY3Rpb24oYSxjLGIpe2E9JChhKTthLndpZHRoPWM7YS5oZWlnaHQ9YjthPWEuZ2V0Q29udGV4dCgiMmQiKTtwKGEsMCwwLGMsYiwiI2ZmZmZmZiIpO3JldHVybiBhfTtnLnJnYjJoZXg9bDtnLmhzdjJoZXg9ZnVuY3Rpb24oYSl7YT1yKGEpO3JldHVybiBsKGFbMF0sYVsxXSxhWzJdKX07Zy5jb2xvcjJyZ2I9cTtnLnJnYjJoc3Y9ZnVuY3Rpb24oYSl7dmFyIGM9YVswXS8yNTUsYj1hWzFdLzI1NTtsZXQgZD1hWzJdLzI1NTthPU1hdGgubWF4KGMsYixkKTtsZXQgZT1hLU1hdGgubWluKGMsYixkKTtjPShNYXRoLmZsb29yKDYwKigwPT1lPzA6YT09Yz8oYi1kKS9lJTY6YT09Yj8oZC1jKS9lKzI6KGMtYikvZSs0KSkrMzYwKSUzNjA7Yj1NYXRoLm1pbihNYXRoLm1heChNYXRoLmZsb29yKDEwMCooMD09YT8wOmUvYSkpLDApLDEwMCk7YT1NYXRoLm1pbihNYXRoLm1heChNYXRoLmZsb29yKDEwMCoKYSksMCksMTAwKTtyZXR1cm5bYyxiLGFdfTtnLmhzdjJyZ2I9cjtnLnNldF9waXhlbD10O2cuY2FjaGVfcGl4ZWxzPWZ1bmN0aW9uKGEpe249YX07Zy5kcmF3X3BpeGVscz1mdW5jdGlvbihhKXtsZXQgYz1hLmNhbnZhcy53aWR0aCxiPWEuZ2V0SW1hZ2VEYXRhKDAsMCxjLGEuY2FudmFzLmhlaWdodCk7T2JqZWN0LmtleXMoaykuZm9yRWFjaChkPT57bGV0IGU9cShkKTtrW2RdLmZvckVhY2goZj0+e2Y9ZlsxXSpjK2ZbMF08PDI7bGV0IGg7Zm9yKGg9MDs0Pmg7aCsrKWIuZGF0YVtmK2hdPWVbaF19KX0pO2EucHV0SW1hZ2VEYXRhKGIsMCwwKTtuPSExO2s9e319O2cuZHJhd19saW5lPWZ1bmN0aW9uKGEsYyxiLGQsZSxmKXtkPT1jJiZlPT1iP3QoYSxjLGIsZik6KGEuYmVnaW5QYXRoKCksYS5tb3ZlVG8oYysuNSxiKy41KSxhLmxpbmVUbyhkKy41LGUrLjUpLGEuc3Ryb2tlU3R5bGU9ZixhLnN0cm9rZSgpKX07Zy5maWxsX3JlY3Q9cDtnLnN0cm9rZV9yZWN0PWZ1bmN0aW9uKGEsYyxiLApkLGUsZil7YS5zdHJva2VTdHlsZT1mO2Euc3Ryb2tlUmVjdChjLGIsZC1jKzEsZS1iKzEpfTtnLmRyYXdfc3RyaW5nPWZ1bmN0aW9uKGEsYyxiLGQsZSxmKXthLnRleHRCYXNlbGluZT0ibWlkZGxlIjthLnRleHRBbGlnbj0iY2VudGVyIjthLmZvbnQ9ZTthLmZpbGxTdHlsZT1mO2EuZmlsbFRleHQoYyxiLGQpfTtnLmRyYXdfaW1hZ2U9ZnVuY3Rpb24oYSxjLGIsZCl7YS5kcmF3SW1hZ2UoYyxiLGQpfTtnLnNhdmVfY2FudmFzPWZ1bmN0aW9uKGEsYyl7YT1hLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIikucmVwbGFjZSgiaW1hZ2UvcG5nIiwiaW1hZ2Uvb2N0ZXQtc3RyZWFtIik7bGV0IGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOyJzdHJpbmciPT10eXBlb2YgYi5kb3dubG9hZD8oYi5ocmVmPWEsYi5kb3dubG9hZD1jLGIuY2xpY2soKSk6d2luZG93LmxvY2F0aW9uLmFzc2lnbihhKX19KTsK"></script>
    <script src="data:text/javascript;base64,Ly8gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi8vIGR1bmdlb24uanMgLy8gdmVyc2lvbiAxLjAuNAovLwovLyB3cml0dGVuIGJ5IGRyb3cgPGRyb3dAYmluLnNoPgovLyBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy8zLjAvCgondXNlIHN0cmljdCc7KChZLFEpPT5RKFkpKSh3aW5kb3csWT0+e2Z1bmN0aW9uIFEoKXtsZXQgYT1nZW5lcmF0ZV90ZXh0KCJEdW5nZW9uIE5hbWUiKTskKCJkdW5nZW9uX25hbWUiKS5zZXRWYWx1ZShhKTtaKCl9ZnVuY3Rpb24gWigpe3tsZXQgYT0kKCJkdW5nZW9uX25hbWUiKS5nZXRWYWx1ZSgpOyQoImR1bmdlb25fdGl0bGUiKS51cGRhdGUoYSl9YWEoKX1mdW5jdGlvbiBhYSgpe3tsZXQgSD1uYSgpO3t2YXIgYT1IO2xldCBCPUwoInJvb21fc2l6ZSIsYSksbD1MKCJyb29tX2xheW91dCIsYSk7YS5odWdlX3Jvb21zPUIuaHVnZTthLmNvbXBsZXhfcm9vbXM9bC5jb21wbGV4O2Eubl9yb29tcz0wO2Eucm9vbT1bXTtpZigiZGVuc2UiPT1hLnJvb21fbGF5b3V0KXt7dmFyIGI9YTtsZXQgcTtmb3IocT0wO3E8Yi5uX2k7cSsrKXtsZXQgdz0yKnErMSxwO2ZvcihwPTA7cDxiLm5fajtwKyspe2xldCByPTIqcCsxO2IuY2VsbFt3XVtyXSYyfHwoMD09cXx8MD09cCkmJjA8cmFuZG9tKDIpfHwKKGI9UihiLHtpOnEsajpwfSksIWIuaHVnZV9yb29tc3x8Yi5jZWxsW3ddW3JdJjJ8fChiPVIoYix7aTpxLGo6cCxzaXplOiJtZWRpdW0ifSkpKX19YT1ifX1lbHNle3t2YXIgZj1hO2xldCBxPWJhKGYpLHc7Zm9yKHc9MDt3PHE7dysrKWY9UihmKTtpZihmLmh1Z2Vfcm9vbXMpe2xldCBwPWJhKGYsIm1lZGl1bSIpLHI7Zm9yKHI9MDtyPHA7cisrKWY9UihmLHtzaXplOiJtZWRpdW0ifSl9YT1mfX19e3ZhciBkPWE7Vz17fTtsZXQgQjtmb3IoQj0xO0I8PWQubl9yb29tcztCKyspYTp7bGV0IGw7dmFyIGc9ZCxjPWQucm9vbVtCXTtsZXQgcT1jYShnLGMpO2lmKCFxLmxlbmd0aCl7ZD1nO2JyZWFrIGF9e2xldCBwPU1hdGguZmxvb3IoTWF0aC5zcXJ0KCgoYy5lYXN0LWMud2VzdCkvMisxKSooKGMuc291dGgtYy5ub3J0aCkvMisxKSkpO3ZhciBlPXArcmFuZG9tKHApfWxldCB3PWU7Zm9yKGw9MDtsPHc7bCsrKXtsZXQgcD1xLnNwbGljZShyYW5kb20ocS5sZW5ndGgpLDEpLnNoaWZ0KCk7CmlmKCFwKWJyZWFrO2lmKCEoZy5jZWxsW3AuZG9vcl9yXVtwLmRvb3JfY10mNDEyODc2OCkpe2xldCByO2lmKHI9cC5vdXRfaWQpe2xldCB4PVtjLmlkLHJdLnNvcnQoTikuam9pbigiLCIpO1dbeF18fChnPWRhKGcsYyxwKSxXW3hdPTEpfWVsc2UgZz1kYShnLGMscCl9fWQ9Z319e3ZhciBoPWQ7bGV0IEI7Zm9yKEI9MTtCPD1oLm5fcm9vbXM7QisrKXtsZXQgbD1oLnJvb21bQl0scT1sLmlkLnRvU3RyaW5nKCksdz1xLmxlbmd0aCxwPU1hdGguZmxvb3IoKGwubm9ydGgrbC5zb3V0aCkvMikscj1NYXRoLmZsb29yKChsLndlc3QrbC5lYXN0LXcpLzIpKzEseDtmb3IoeD0wO3g8dzt4KyspaC5jZWxsW3BdW3IreF18PXEuY2hhckNvZGVBdCh4KTw8MjR9fXt2YXIgaz1oO2xldCBCPUwoImNvcnJpZG9yX2xheW91dCIsayk7ay5zdHJhaWdodF9wY3Q9Qi5wY3Q7bGV0IGw7Zm9yKGw9MTtsPGsubl9pO2wrKyl7bGV0IHE9MipsKzEsdztmb3Iodz0xO3c8ay5uX2o7dysrKWsuY2VsbFtxXVsyKgp3KzFdJjR8fChrPWVhKGssbCx3KSl9SD1rfWlmKEguYWRkX3N0YWlycyl7e3ZhciBtPUg7bGV0IEI9b2EobSk7aWYoQi5sZW5ndGgpe3tsZXQgbD0wOyJtYW55Ij09bS5hZGRfc3RhaXJzP2w9MytyYW5kb20oTWF0aC5mbG9vcihtLm5fY29scyptLm5fcm93cy8xRTMpKToieWVzIj09bS5hZGRfc3RhaXJzJiYobD0yKTt2YXIgdD1sfWlmKDAhPXQpe3ZhciB6PVtdLHk7Zm9yKHk9MDt5PHQ7eSsrKXtsZXQgbD1CLnNwbGljZShyYW5kb20oQi5sZW5ndGgpLDEpLnNoaWZ0KCk7aWYoIWwpYnJlYWs7bGV0IHE9bC5yb3csdz1sLmNvbDswPT0oMj55P3k6cmFuZG9tKDIpKT8obS5jZWxsW3FdW3ddfD00MTk0MzA0LGwua2V5PSJkb3duIik6KG0uY2VsbFtxXVt3XXw9ODM4ODYwOCxsLmtleT0idXAiKTt6LnB1c2gobCl9bS5zdGFpcj16fX1IPW19fXZhciBBPUg7aWYoQS5yZW1vdmVfZGVhZGVuZHMpe3t2YXIgST1BO2xldCBCPUwoInJlbW92ZV9kZWFkZW5kcyIsSSk7SS5yZW1vdmVfcGN0PUIucGN0OwpBPWZhKEksSS5yZW1vdmVfcGN0LHBhKX19QS5yZW1vdmVfZGVhZGVuZHMmJigiZXJyYW50Ij09QS5jb3JyaWRvcl9sYXlvdXQ/QS5jbG9zZV9hcmNzPUEucmVtb3ZlX3BjdDoic3RyYWlnaHQiPT1BLmNvcnJpZG9yX2xheW91dCYmKEEuY2xvc2VfYXJjcz1BLnJlbW92ZV9wY3QpKTtBLmNsb3NlX2FyY3MmJihBPWhhKEEpKTtBPXFhKEEpO3t2YXIgdT1BO2xldCBCPXUuY2VsbCxsO2ZvcihsPTA7bDw9dS5uX3Jvd3M7bCsrKXtsZXQgcTtmb3IocT0wO3E8PXUubl9jb2xzO3ErKylCW2xdW3FdJjEmJihCW2xdW3FdPTApfXUuY2VsbD1CfXZhciB2PUg9dX17e2xldCBsPXttYXBfc3R5bGU6di5tYXBfc3R5bGUsZ3JpZDp2LmdyaWR9O2wuY2VsbF9zaXplPXYuY2VsbF9zaXplO2wud2lkdGg9KHYubl9jb2xzKzEpKmwuY2VsbF9zaXplKzE7bC5oZWlnaHQ9KHYubl9yb3dzKzEpKmwuY2VsbF9zaXplKzE7bC5tYXhfeD1sLndpZHRoLTE7bC5tYXhfeT1sLmhlaWdodC0xO2wuZm9udD1NYXRoLmZsb29yKC43NSoKbC5jZWxsX3NpemUpLnRvU3RyaW5nKCkrInB4IHNhbnMtc2VyaWYiO3ZhciBuPWx9bGV0IEg9bmV3X2ltYWdlKCJtYXAiLG4ud2lkdGgsbi5oZWlnaHQpLEI9cmEobik7bi5wYWxldHRlPUI7e2xldCBsPW5ldyBFbGVtZW50KCJjYW52YXMiKTtsLndpZHRoPW4ud2lkdGg7bC5oZWlnaHQ9bi5oZWlnaHQ7bGV0IHE9bC5nZXRDb250ZXh0KCIyZCIpLHc9bi5tYXhfeCxwPW4ubWF4X3kscj1uLnBhbGV0dGUseDsoeD1yLm9wZW4pP2ZpbGxfcmVjdChxLDAsMCx3LHAseCk6ZmlsbF9yZWN0KHEsMCwwLHcscCxyLndoaXRlKTsoeD1yLm9wZW5fZ3JpZCk/Uyh2LG4seCxxKTooeD1yLmdyaWQpJiZTKHYsbix4LHEpO3ZhciBzYT1sfW4uYmFzZV9sYXllcj1zYTt7dmFyIE89SDtsZXQgbD1uLm1heF94LHE9bi5tYXhfeSx3PW4ucGFsZXR0ZSxwOyhwPXcuZmlsbCk/ZmlsbF9yZWN0KE8sMCwwLGwscSxwKTpmaWxsX3JlY3QoTywwLDAsbCxxLHcuYmxhY2spOyhwPXcuZmlsbCkmJmZpbGxfcmVjdChPLAowLDAsbCxxLHApOyhwPXcuZmlsbF9ncmlkKT9TKHYsbixwLE8pOihwPXcuZ3JpZCkmJlModixuLHAsTyl9e3ZhciB0YT1IO2xldCBsPW4uY2VsbF9zaXplLHE9bi5iYXNlX2xheWVyLHc7Zm9yKHc9MDt3PD12Lm5fcm93czt3Kyspe2xldCBwPXcqbCxyO2ZvcihyPTA7cjw9di5uX2NvbHM7cisrKWlmKHYuY2VsbFt3XVtyXSY2KXtsZXQgeD1yKmw7dGEuZHJhd0ltYWdlKHEseCxwLGwsbCx4LHAsbCxsKX19fXt2YXIgRj1IO2xldCBsPW4uY2VsbF9zaXplLHE9TWF0aC5mbG9vcihsLzQpOzM+cSYmKHE9Myk7bGV0IHc9bi5wYWxldHRlLHA7Y2FjaGVfcGl4ZWxzKCEwKTtsZXQgcjtmb3Iocj0wO3I8PXYubl9yb3dzO3IrKyl7bGV0IHg9cipsLEU9eCtsLEM7Zm9yKEM9MDtDPD12Lm5fY29scztDKyspe2lmKCEodi5jZWxsW3JdW0NdJjYpKWNvbnRpbnVlO2xldCBEPUMqbCxHPUQrbDtpZihwPXcuYmV2ZWxfbncpe2lmKHYuY2VsbFtyXVtDLTFdJjZ8fGRyYXdfbGluZShGLEQtMSx4LEQtMSwKRSxwKSx2LmNlbGxbci0xXVtDXSY2fHxkcmF3X2xpbmUoRixELHgtMSxHLHgtMSxwKSxwPXcuYmV2ZWxfc2Updi5jZWxsW3JdW0MrMV0mNnx8ZHJhd19saW5lKEYsRysxLHgrMSxHKzEsRSxwKSx2LmNlbGxbcisxXVtDXSY2fHxkcmF3X2xpbmUoRixEKzEsRSsxLEcsRSsxLHApfWVsc2UgaWYocD13LndhbGxfc2hhZGluZyl2LmNlbGxbci0xXVtDLTFdJjZ8fEsoRixELXEseC1xLEQtMSx4LTEscCksdi5jZWxsW3ItMV1bQ10mNnx8SyhGLEQseC1xLEcseC0xLHApLHYuY2VsbFtyLTFdW0MrMV0mNnx8SyhGLEcrMSx4LXEsRytxLHgtMSxwKSx2LmNlbGxbcl1bQy0xXSY2fHxLKEYsRC1xLHgsRC0xLEUscCksdi5jZWxsW3JdW0MrMV0mNnx8SyhGLEcrMSx4LEcrcSxFLHApLHYuY2VsbFtyKzFdW0MtMV0mNnx8SyhGLEQtcSxFKzEsRC0xLEUrcSxwKSx2LmNlbGxbcisxXVtDXSY2fHxLKEYsRCxFKzEsRyxFK3EscCksdi5jZWxsW3IrMV1bQysxXSY2fHxLKEYsRysxLEUrMSxHK3EsRStxLHApOwppZihwPXcud2FsbCl2LmNlbGxbci0xXVtDXSY2fHxkcmF3X2xpbmUoRixELHgsRyx4LHApLHYuY2VsbFtyXVtDLTFdJjZ8fGRyYXdfbGluZShGLEQseCxELEUscCksdi5jZWxsW3JdW0MrMV0mNnx8ZHJhd19saW5lKEYsRyx4LEcsRSxwKSx2LmNlbGxbcisxXVtDXSY2fHxkcmF3X2xpbmUoRixELEUsRyxFLHApfX1kcmF3X3BpeGVscyhGKX12LmRvb3ImJnVhKHYsbixIKTt7dmFyIHZhPUg7bGV0IGw9bi5jZWxsX3NpemUscT1NYXRoLmZsb29yKGwvMiksdz1uLmZvbnQscD1UKG4ucGFsZXR0ZSwibGFiZWwiKSxyO2ZvcihyPTA7cjw9di5uX3Jvd3M7cisrKXtsZXQgeDtmb3IoeD0wO3g8PXYubl9jb2xzO3grKyl7aWYoISh2LmNlbGxbcl1beF0mNikpY29udGludWU7YTp7bGV0IEM9di5jZWxsW3JdW3hdPj4yNCYyNTU7aWYoMD09Qyl7dmFyIGlhPSExO2JyZWFrIGF9bGV0IEQ9U3RyaW5nLmZyb21DaGFyQ29kZShDKTtpYT0hL15cdy8udGVzdChEKXx8L1toamtsXS8udGVzdChEKT8hMToKRH1sZXQgRT1pYTtFJiZkcmF3X3N0cmluZyh2YSxFLHgqbCtxLHIqbCtxKzEsdyxwKX19fXYuc3RhaXImJndhKHYsbixIKX19ZnVuY3Rpb24gbmEoKXtsZXQgYT17c2VlZDpzZXRfcHJuZ19zZWVkKCQoImR1bmdlb25fbmFtZSIpLmdldFZhbHVlKCkpfTtPYmplY3Qua2V5cyhKKS5mb3JFYWNoKGM9PnthW2NdPSQoYykuZ2V0VmFsdWUoKX0pO3ZhciBiPUwoImR1bmdlb25fc2l6ZSIsYSk7bGV0IGY9TCgiZHVuZ2Vvbl9sYXlvdXQiLGEpO3ZhciBkPWIuc2l6ZTtiPWIuY2VsbDthLm5faT1NYXRoLmZsb29yKGQqZi5hc3BlY3QvYik7YS5uX2o9TWF0aC5mbG9vcihkL2IpO2EuY2VsbF9zaXplPWI7YS5uX3Jvd3M9MiphLm5faTthLm5fY29scz0yKmEubl9qO2EubWF4X3Jvdz1hLm5fcm93cy0xO2EubWF4X2NvbD1hLm5fY29scy0xO2EuY2VsbD1bXTtmb3IoZD0wO2Q8PWEubl9yb3dzO2QrKylmb3IoYS5jZWxsW2RdPVtdLGI9MDtiPD1hLm5fY29scztiKyspYS5jZWxsW2RdW2JdPTA7bGV0IGc7CihnPWYubWFzayk/YT14YShhLGcpOiJzYWx0aXJlIj09YS5kdW5nZW9uX2xheW91dD9hPXlhKGEpOiJoZXhhZ29uIj09YS5kdW5nZW9uX2xheW91dD9hPXphKGEpOiJyb3VuZCI9PWEuZHVuZ2Vvbl9sYXlvdXQmJihhPUFhKGEpKTtyZXR1cm4gYX1mdW5jdGlvbiBMKGEsYil7cmV0dXJuIEpbYV1bYlthXV19ZnVuY3Rpb24geGEoYSxiKXtsZXQgZj1iLmxlbmd0aC8oYS5uX3Jvd3MrMSksZD1iWzBdLmxlbmd0aC8oYS5uX2NvbHMrMSksZztmb3IoZz0wO2c8PWEubl9yb3dzO2crKyl7bGV0IGM9YltNYXRoLmZsb29yKGcqZildLGU7Zm9yKGU9MDtlPD1hLm5fY29scztlKyspY1tNYXRoLmZsb29yKGUqZCldfHwoYS5jZWxsW2ddW2VdPTEpfXJldHVybiBhfWZ1bmN0aW9uIHlhKGEpe2xldCBiPU1hdGguZmxvb3IoYS5uX3Jvd3MvNCksZjtmb3IoZj0wO2Y8YjtmKyspe3ZhciBkPWIrZjtsZXQgZz1hLm5fY29scy1kO2Zvcig7ZDw9ZztkKyspYS5jZWxsW2ZdW2RdPTEsYS5jZWxsW2Eubl9yb3dzLQpmXVtkXT0xLGEuY2VsbFtkXVtmXT0xLGEuY2VsbFtkXVthLm5fY29scy1mXT0xfXJldHVybiBhfWZ1bmN0aW9uIHphKGEpe2xldCBiPU1hdGguZmxvb3IoYS5uX3Jvd3MvMiksZjtmb3IoZj0wO2Y8PWEubl9yb3dzO2YrKyl7bGV0IGQ9TWF0aC5mbG9vciguNTc3MzUqTWF0aC5hYnMoZi1iKSkrMSxnPWEubl9jb2xzLWQsYztmb3IoYz0wO2M8PWEubl9jb2xzO2MrKylpZihjPGR8fGM+ZylhLmNlbGxbZl1bY109MX1yZXR1cm4gYX1mdW5jdGlvbiBBYShhKXtsZXQgYj1hLm5fcm93cy8yLGY9YS5uX2NvbHMvMixkO2ZvcihkPTA7ZDw9YS5uX3Jvd3M7ZCsrKXtsZXQgZz1NYXRoLnBvdyhkL2ItMSwyKSxjO2ZvcihjPTA7Yzw9YS5uX2NvbHM7YysrKTE8TWF0aC5zcXJ0KGcrTWF0aC5wb3coYy9mLTEsMikpJiYoYS5jZWxsW2RdW2NdPTEpfXJldHVybiBhfWZ1bmN0aW9uIGJhKGEsYil7Yj1KLnJvb21fc2l6ZVtifHxhLnJvb21fc2l6ZV07Yj0oYi5zaXplfHwyKSsoYi5yYWRpeHx8NSkrMTsKYj0yKk1hdGguZmxvb3IoYS5uX2NvbHMqYS5uX3Jvd3MvKGIqYikpOyJzcGFyc2UiPT1hLnJvb21fbGF5b3V0JiYoYi89MTMpO3JldHVybiBifWZ1bmN0aW9uIFIoYSxiKXtpZig5OTk9PWEubl9yb29tcylyZXR1cm4gYTt2YXIgZj1ifHx7fTtiPWY7Yi5zaXplfHwoYi5zaXplPWEucm9vbV9zaXplKTt2YXIgZD1KLnJvb21fc2l6ZVtiLnNpemVdLGc9ZC5zaXplfHwyO2Q9ZC5yYWRpeHx8NTtpZighKCJoZWlnaHQiaW4gYikpaWYoImkiaW4gYil7dmFyIGM9YS5uX2ktZy1iLmk7MD5jJiYoYz0wKTtiLmhlaWdodD1yYW5kb20oYzxkP2M6ZCkrZ31lbHNlIGIuaGVpZ2h0PXJhbmRvbShkKStnOyJ3aWR0aCJpbiBifHwoImoiaW4gYj8oYz1hLm5fai1nLWIuaiwwPmMmJihjPTApLGIud2lkdGg9cmFuZG9tKGM8ZD9jOmQpK2cpOmIud2lkdGg9cmFuZG9tKGQpK2cpOyJpImluIGJ8fChiLmk9cmFuZG9tKGEubl9pLWIuaGVpZ2h0KSk7ImoiaW4gYnx8KGIuaj1yYW5kb20oYS5uX2otYi53aWR0aCkpOwpmPWI7Yj0yKmYuaSsxO2c9MipmLmorMTtkPTIqKGYuaStmLmhlaWdodCktMTtjPTIqKGYuaitmLndpZHRoKS0xO3ZhciBlLGg7aWYoMT5ifHxkPmEubWF4X3Jvd3x8MT5nfHxjPmEubWF4X2NvbClyZXR1cm4gYTthOnt2YXIgaz17fTtmb3IoZT1iO2U8PWQ7ZSsrKWZvcihoPWc7aDw9YztoKyspe2lmKGEuY2VsbFtlXVtoXSYxKXtrPXtibG9ja2VkOjF9O2JyZWFrIGF9YS5jZWxsW2VdW2hdJjImJihrWyhhLmNlbGxbZV1baF0mNjU0NzIpPj42XSs9MSl9fWlmKGsuYmxvY2tlZClyZXR1cm4gYTtrPSRIKGspLmtleXMoKTtlPWsubGVuZ3RoO2lmKDA9PWUpaz1hLm5fcm9vbXMrMSxhLm5fcm9vbXM9aztlbHNlIGlmKDE9PWUpaWYoYS5jb21wbGV4X3Jvb21zKXtpZihrPWtbMF0sayE9Zi5jb21wbGV4X2lkKXJldHVybiBhfWVsc2UgcmV0dXJuIGE7ZWxzZSByZXR1cm4gYTtmb3IoZT1iO2U8PWQ7ZSsrKWZvcihoPWc7aDw9YztoKyspYS5jZWxsW2VdW2hdJjMyP2EuY2VsbFtlXVtoXSY9MTI2NDg0MTU6CmEuY2VsbFtlXVtoXSYxNiYmKGEuY2VsbFtlXVtoXSY9LTE3KSxhLmNlbGxbZV1baF09YS5jZWxsW2VdW2hdfDJ8azw8NjtmPXtpZDprLHNpemU6Zi5zaXplLHJvdzpiLGNvbDpnLG5vcnRoOmIsc291dGg6ZCx3ZXN0OmcsZWFzdDpjLGhlaWdodDoxMCooZC1iKzEpLHdpZHRoOjEwKihjLWcrMSksZG9vcjp7bm9ydGg6W10sc291dGg6W10sd2VzdDpbXSxlYXN0OltdfX07KGU9YS5yb29tW2tdKT9lLmNvbXBsZXg/ZS5jb21wbGV4LnB1c2goZik6KGNvbXBsZXg9e2NvbXBsZXg6W2UsZl19LGEucm9vbVtrXT1jb21wbGV4KTphLnJvb21ba109Zjtmb3IoZT1iLTE7ZTw9ZCsxO2UrKylhLmNlbGxbZV1bZy0xXSYzNHx8KGEuY2VsbFtlXVtnLTFdfD0xNiksYS5jZWxsW2VdW2MrMV0mMzR8fChhLmNlbGxbZV1bYysxXXw9MTYpO2ZvcihoPWctMTtoPD1jKzE7aCsrKWEuY2VsbFtiLTFdW2hdJjM0fHwoYS5jZWxsW2ItMV1baF18PTE2KSxhLmNlbGxbZCsxXVtoXSYzNHx8KGEuY2VsbFtkKzFdW2hdfD0KMTYpO3JldHVybiBhfWZ1bmN0aW9uIE4oYSxiKXtyZXR1cm4gYS1ifWZ1bmN0aW9uIGNhKGEsYil7bGV0IGY9YS5jZWxsLGQ9W107aWYoYi5jb21wbGV4KWIuY29tcGxleC5mb3JFYWNoKGg9PntoPWNhKGEsaCk7aC5sZW5ndGgmJihkPWQuY29uY2F0KGgpKX0pO2Vsc2V7dmFyIGc9Yi5ub3J0aDtsZXQgaD1iLnNvdXRoLGs9Yi53ZXN0LG09Yi5lYXN0O2lmKDM8PWcpe3ZhciBjO2ZvcihjPWs7Yzw9bTtjKz0yKXtsZXQgdDsodD1VKGYsYixnLGMsIm5vcnRoIikpJiZkLnB1c2godCl9fWlmKGg8PWEubl9yb3dzLTMpZm9yKGM9aztjPD1tO2MrPTIpe3ZhciBlPXZvaWQgMDsoZT1VKGYsYixoLGMsInNvdXRoIikpJiZkLnB1c2goZSl9aWYoMzw9aylmb3IoZT1nO2U8PWg7ZSs9Mil7bGV0IHQ7KHQ9VShmLGIsZSxrLCJ3ZXN0IikpJiZkLnB1c2godCl9aWYobTw9YS5uX2NvbHMtMylmb3IoO2c8PWg7Zys9Mil7bGV0IHQ7KHQ9VShmLGIsZyxtLCJlYXN0IikpJiZkLnB1c2godCl9fXJldHVybiBkfQpmdW5jdGlvbiBVKGEsYixmLGQsZyl7bGV0IGM9ZitQW2ddLGU9ZCtNW2ddLGg9YVtjXVtlXTtpZighKGgmMTYpfHxoJjQxMjg3NjkpcmV0dXJuITE7YT1hW2MrUFtnXV1bZStNW2ddXTtpZihhJjEpcmV0dXJuITE7YT0oYSY2NTQ3Mik+PjY7cmV0dXJuIGE9PWIuaWQ/ITE6e3NpbGxfcjpmLHNpbGxfYzpkLGRpcjpnLGRvb3JfcjpjLGRvb3JfYzplLG91dF9pZDphfX1mdW5jdGlvbiBkYShhLGIsZil7dmFyIGQ9TCgiZG9vcnMiLGEpLnRhYmxlO2xldCBnPWYuZG9vcl9yLGM9Zi5kb29yX2M7dmFyIGU9Zi5zaWxsX3I7bGV0IGg9Zi5zaWxsX2Msaz1mLmRpcjtmPWYub3V0X2lkO2xldCBtO2ZvcihtPTA7Mz5tO20rKyl7bGV0IHQ9ZStQW2tdKm0sej1oK01ba10qbTthLmNlbGxbdF1bel0mPS0xNzthLmNlbGxbdF1bel18PTMyfWQ9c2VsZWN0X2Zyb21fdGFibGUoZCk7ZT17cm93OmcsY29sOmN9OzY1NTM2PT1kPyhhLmNlbGxbZ11bY118PTY1NTM2LGUua2V5PSJhcmNoIixlLnR5cGU9IkFyY2h3YXkiKToKMTMxMDcyPT1kPyhhLmNlbGxbZ11bY118PTEzMTA3MixlLmtleT0ib3BlbiIsZS50eXBlPSJVbmxvY2tlZCBEb29yIik6MjYyMTQ0PT1kPyhhLmNlbGxbZ11bY118PTI2MjE0NCxlLmtleT0ibG9jayIsZS50eXBlPSJMb2NrZWQgRG9vciIpOjUyNDI4OD09ZD8oYS5jZWxsW2ddW2NdfD01MjQyODgsZS5rZXk9InRyYXAiLGUudHlwZT0iVHJhcHBlZCBEb29yIik6MTA0ODU3Nj09ZD8oYS5jZWxsW2ddW2NdfD0xMDQ4NTc2LGUua2V5PSJzZWNyZXQiLGUudHlwZT0iU2VjcmV0IERvb3IiKToyMDk3MTUyPT1kJiYoYS5jZWxsW2ddW2NdfD0yMDk3MTUyLGUua2V5PSJwb3J0YyIsZS50eXBlPSJQb3J0Y3VsbGlzIik7ZiYmKGUub3V0X2lkPWYpO2IuZG9vcltrXS5wdXNoKGUpO2IubGFzdF9kb29yPWU7cmV0dXJuIGF9ZnVuY3Rpb24gZWEoYSxiLGYsZCl7QmEoYSxkKS5mb3JFYWNoKGc9Pnt2YXIgYz1hLGU9MipiKzEsaD0yKmYrMSxrPTIqKGIrUFtnXSkrMSxtPTIqKGYrTVtnXSkrMTtiOnt2YXIgdD0KKGgrbSkvMix6PW07aWYoMD5rfHxrPmMubl9yb3dzfHwwPnp8fHo+Yy5uX2NvbHMpdmFyIHk9ITE7ZWxzZXt5PVsoZStrKS8yLGtdLnNvcnQoTik7dD1bdCx6XS5zb3J0KE4pO2Zvcih6PXlbMF07ejw9eVsxXTt6Kyspe2xldCBBO2ZvcihBPXRbMF07QTw9dFsxXTtBKyspaWYoYy5jZWxsW3pdW0FdJjIxKXt5PSExO2JyZWFrIGJ9fXk9ITB9fWlmKHkpe2U9W2Usa10uc29ydChOKTtrPVtoLG1dLnNvcnQoTik7Zm9yKG09ZVswXTttPD1lWzFdO20rKylmb3IoaD1rWzBdO2g8PWtbMV07aCsrKWMuY2VsbFttXVtoXSY9LTMzLGMuY2VsbFttXVtoXXw9NDtjPSEwfWVsc2UgYz0hMTtjJiYoYT1lYShhLGIrUFtnXSxmK01bZ10sZykpfSk7cmV0dXJuIGF9ZnVuY3Rpb24gQmEoYSxiKXt7dmFyIGY9Q2EuY29uY2F0KCk7bGV0IGQ7Zm9yKGQ9Zi5sZW5ndGgtMTswPGQ7ZC0tKXtsZXQgZz1yYW5kb20oZCsxKSxjPWZbZF07ZltkXT1mW2ddO2ZbZ109Y319YiYmYS5zdHJhaWdodF9wY3QmJnJhbmRvbSgxMDApPAphLnN0cmFpZ2h0X3BjdCYmZi51bnNoaWZ0KGIpO3JldHVybiBmfWZ1bmN0aW9uIG9hKGEpe2xldCBiPWEuY2VsbCxmPVtdLGQ7Zm9yKGQ9MDtkPGEubl9pO2QrKyl7bGV0IGc9MipkKzEsYztmb3IoYz0wO2M8YS5uX2o7YysrKXtsZXQgZT0yKmMrMTs0PT1hLmNlbGxbZ11bZV0mJihhLmNlbGxbZ11bZV0mMTI1ODI5MTJ8fE9iamVjdC5rZXlzKFgpLmZvckVhY2goaD0+e2lmKGphKGIsZyxlLFhbaF0pKXtsZXQgaz17cm93OmcsY29sOmUsZGlyOmh9O2g9WFtoXS5uZXh0O2submV4dF9yb3c9ay5yb3craFswXTtrLm5leHRfY29sPWsuY29sK2hbMV07Zi5wdXNoKGspfX0pKX19cmV0dXJuIGZ9ZnVuY3Rpb24gamEoYSxiLGYsZCl7bGV0IGc9ITAsYztpZihjPWQuY29ycmlkb3IpaWYoYy5mb3JFYWNoKGU9PnthW2IrZVswXV0mJjQhPWFbYitlWzBdXVtmK2VbMV1dJiYoZz0hMSl9KSwhZylyZXR1cm4hMTtpZihkPWQud2FsbGVkKWlmKGQuZm9yRWFjaChlPT57YVtiK2VbMF1dJiZhW2IrZVswXV1bZisKZVsxXV0mNiYmKGc9ITEpfSksIWcpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gaGEoYSl7cmV0dXJuIGZhKGEsYS5jbG9zZV9hcmNzLGhhKX1mdW5jdGlvbiBmYShhLGIsZil7bGV0IGQ9MTAwPT1iLGc7Zm9yKGc9MDtnPGEubl9pO2crKyl7bGV0IGM9MipnKzEsZTtmb3IoZT0wO2U8YS5uX2o7ZSsrKXtsZXQgaD0yKmUrMTthLmNlbGxbY11baF0mNiYmIShhLmNlbGxbY11baF0mMTI1ODI5MTIpJiYoZHx8cmFuZG9tKDEwMCk8YikmJihhPWthKGEsYyxoLGYpKX19cmV0dXJuIGF9ZnVuY3Rpb24ga2EoYSxiLGYsZCl7bGV0IGc9YS5jZWxsO2lmKCEoYS5jZWxsW2JdW2ZdJjYpKXJldHVybiBhO09iamVjdC5rZXlzKGQpLmZvckVhY2goYz0+e2lmKGphKGcsYixmLGRbY10pKXt2YXIgZTsoZT1kW2NdLmNsb3NlKSYmZS5mb3JFYWNoKGg9PntnW2IraFswXV1bZitoWzFdXT0wfSk7aWYoZT1kW2NdLm9wZW4pZ1tiK2VbMF1dW2YrZVsxXV18PTQ7aWYoYz1kW2NdLnJlY3Vyc2UpYT1rYShhLApiK2NbMF0sZitjWzFdLGQpfX0pO2EuY2VsbD1nO3JldHVybiBhfWZ1bmN0aW9uIHFhKGEpe2xldCBiPXt9LGY9W107YS5yb29tLmZvckVhY2goZD0+e2xldCBnPWQuaWQ7T2JqZWN0LmtleXMoZC5kb29yKS5mb3JFYWNoKGM9PntsZXQgZT1bXTtkLmRvb3JbY10uZm9yRWFjaChoPT57dmFyIGs9aC5yb3csbT1oLmNvbDtpZihhLmNlbGxba11bbV0mNilpZihrPVtrLG1dLmpvaW4oKSxiW2tdKWUucHVzaChoKTtlbHNle2lmKG09aC5vdXRfaWQpe2xldCB0PWEucm9vbVttXSx6PURhW2NdO2gub3V0X2lkPXt9O2gub3V0X2lkW2ddPW07aC5vdXRfaWRbbV09Zzt0LmRvb3Jbel0ucHVzaChoKX1lLnB1c2goaCk7YltrXT0hMH19KTtlLmxlbmd0aD8oZC5kb29yW2NdPWUsZj1mLmNvbmNhdChlKSk6ZC5kb29yW2NdPVtdfSl9KTthLmRvb3I9ZjtyZXR1cm4gYX1mdW5jdGlvbiByYShhKXtsZXQgYjtpZihhLnBhbGV0dGUpYj1hLnBhbGV0dGU7ZWxzZXtsZXQgZDtiPShkPWEubWFwX3N0eWxlKT8KVltkXT9WW2RdOlYuc3RhbmRhcmQ6Vi5zdGFuZGFyZH1sZXQgZjsoZj1iLmNvbG9ycykmJk9iamVjdC5rZXlzKGYpLmZvckVhY2goZD0+e2JbZF09ZltkXX0pO2IuYmxhY2t8fChiLmJsYWNrPSIjMDAwMDAwIik7Yi53aGl0ZXx8KGIud2hpdGU9IiNmZmZmZmYiKTtyZXR1cm4gYn1mdW5jdGlvbiBUKGEsYil7Zm9yKDtiOyl7aWYoYVtiXSlyZXR1cm4gYVtiXTtiPUVhW2JdfXJldHVybiIjMDAwMDAwIn1mdW5jdGlvbiBTKGEsYixmLGQpe2lmKCJub25lIiE9YS5ncmlkKWlmKCJoZXgiPT1hLmdyaWQpe3ZhciBnPWIuY2VsbF9zaXplO2E9Zy8zLjQ2NDEwMTYxNTE7Zy89Mjt2YXIgYz1iLndpZHRoLygzKmEpO2I9Yi5oZWlnaHQvZzt2YXIgZTtmb3IoZT0wO2U8YztlKyspe3ZhciBoPTMqZSphLGs9aCthLG09aCszKmEsdD12b2lkIDA7Zm9yKHQ9MDt0PGI7dCsrKXt2YXIgej10KmcseT16K2c7MCE9KGUrdCklMj8oZHJhd19saW5lKGQsaCx6LGsseSxmKSxkcmF3X2xpbmUoZCxrLHksbSx5LApmKSk6ZHJhd19saW5lKGQsayx6LGgseSxmKX19fWVsc2UgaWYoInZleCI9PWEuZ3JpZClmb3IoZz1iLmNlbGxfc2l6ZSxhPWcvMixnLz0zLjQ2NDEwMTYxNTEsYz1iLndpZHRoL2EsYj1iLmhlaWdodC8oMypnKSxlPTA7ZTxiO2UrKylmb3IoaD0zKmUqZyxrPWgrZyxtPWgrMypnLHQ9MDt0PGM7dCsrKXo9dCphLHk9eithLDAhPShlK3QpJTI/KGRyYXdfbGluZShkLHosaCx5LGssZiksZHJhd19saW5lKGQseSxrLHksbSxmKSk6ZHJhd19saW5lKGQseixrLHksaCxmKTtlbHNle2E9Yi5jZWxsX3NpemU7Zm9yKGc9MDtnPD1iLm1heF94O2crPWEpZHJhd19saW5lKGQsZywwLGcsYi5tYXhfeSxmKTtmb3IoZz0wO2c8PWIubWF4X3k7Zys9YSlkcmF3X2xpbmUoZCwwLGcsYi5tYXhfeCxnLGYpfXJldHVybiEwfWZ1bmN0aW9uIEsoYSxiLGYsZCxnLGMpe2Zvcig7Yjw9ZDtiKyspe2xldCBlO2ZvcihlPWY7ZTw9ZztlKyspMCE9KGIrZSklMiYmc2V0X3BpeGVsKGEsYixlLGMpfXJldHVybiEwfWZ1bmN0aW9uIHVhKGEsCmIsZil7bGV0IGQ9YS5kb29yLGc9Yi5jZWxsX3NpemUsYz1NYXRoLmZsb29yKGcvNiksZT1NYXRoLmZsb29yKGcvNCksaD1NYXRoLmZsb29yKGcvMyk7Yj1iLnBhbGV0dGU7bGV0IGs9VChiLCJ3YWxsIiksbT1UKGIsImRvb3IiKTtkLmZvckVhY2godD0+e3ZhciB6PXQucm93LHk9eipnLEE9dC5jb2w7bGV0IEk9QSpnO2lmKCJhcmNoIj09dC5rZXkpdmFyIHU9e2FyY2g6MX07ZWxzZSJvcGVuIj09dC5rZXk/dT17YXJjaDoxLGRvb3I6MX06ImxvY2siPT10LmtleT91PXthcmNoOjEsZG9vcjoxLGxvY2s6MX06InRyYXAiPT10LmtleT8odT17YXJjaDoxLGRvb3I6MSx0cmFwOjF9LC9Mb2NrLy50ZXN0KHQuZGVzYykmJih1LmxvY2s9MSkpOiJzZWNyZXQiPT10LmtleT91PXt3YWxsOjEsYXJjaDoxLHNlY3JldDoxfToicG9ydGMiPT10LmtleSYmKHU9e2FyY2g6MSxwb3J0YzoxfSk7dD11O2xldCB2PWEuY2VsbFt6XVtBLTFdJjY7ej15K2c7QT1JK2c7dT1NYXRoLmZsb29yKCh5K3opLzIpOwpsZXQgbj1NYXRoLmZsb29yKChJK0EpLzIpO3Qud2FsbCYmKHY/ZHJhd19saW5lKGYsbix5LG4seixrKTpkcmF3X2xpbmUoZixJLHUsQSx1LGspKTt0LmFyY2gmJih2PyhmaWxsX3JlY3QoZixuLTEseSxuKzEseStjLGspLGZpbGxfcmVjdChmLG4tMSx6LWMsbisxLHosaykpOihmaWxsX3JlY3QoZixJLHUtMSxJK2MsdSsxLGspLGZpbGxfcmVjdChmLEEtYyx1LTEsQSx1KzEsaykpKTt0LmRvb3ImJih2P3N0cm9rZV9yZWN0KGYsbi1lLHkrYysxLG4rZSx6LWMtMSxtKTpzdHJva2VfcmVjdChmLEkrYysxLHUtZSxBLWMtMSx1K2UsbSkpO3QubG9jayYmKHY/ZHJhd19saW5lKGYsbix5K2MrMSxuLHotYy0xLG0pOmRyYXdfbGluZShmLEkrYysxLHUsQS1jLTEsdSxtKSk7dC50cmFwJiYodj9kcmF3X2xpbmUoZixuLWgsdSxuK2gsdSxtKTpkcmF3X2xpbmUoZixuLHUtaCxuLHUraCxtKSk7dC5zZWNyZXQmJih2PyhkcmF3X2xpbmUoZixuLTEsdS1lLG4rMix1LWUsbSksZHJhd19saW5lKGYsbi0KMix1LWUrMSxuLTIsdS0xLG0pLGRyYXdfbGluZShmLG4tMSx1LG4rMSx1LG0pLGRyYXdfbGluZShmLG4rMix1KzEsbisyLHUrZS0xLG0pLGRyYXdfbGluZShmLG4tMix1K2UsbisxLHUrZSxtKSk6KGRyYXdfbGluZShmLG4tZSx1LTIsbi1lLHUrMSxtKSxkcmF3X2xpbmUoZixuLWUrMSx1KzIsbi0xLHUrMixtKSxkcmF3X2xpbmUoZixuLHUtMSxuLHUrMSxtKSxkcmF3X2xpbmUoZixuKzEsdS0yLG4rZS0xLHUtMixtKSxkcmF3X2xpbmUoZixuK2UsdS0xLG4rZSx1KzIsbSkpKTtpZih0LnBvcnRjKWlmKHYpZm9yKHk9eStjKzI7eTx6LWM7eSs9MilzZXRfcGl4ZWwoZixuLHksbSk7ZWxzZSBmb3IoeT1JK2MrMjt5PEEtYzt5Kz0yKXNldF9waXhlbChmLHksdSxtKX0pO3JldHVybiEwfWZ1bmN0aW9uIHdhKGEsYixmKXthPWEuc3RhaXI7bGV0IGQ9RmEoYi5jZWxsX3NpemUpLGc9VChiLnBhbGV0dGUsInN0YWlyIik7YS5mb3JFYWNoKGM9PntpZihjLm5leHRfcm93IT1jLnJvdyl7dmFyIGU9Ck1hdGguZmxvb3IoKGMuY29sKy41KSpkLmNlbGwpO3ZhciBoPWxhKGMucm93LGMubmV4dF9yb3csZCksaz1oLnNoaWZ0KCk7ZT17eGM6ZSx5MTprLGxpc3Q6aH19ZWxzZSBlPU1hdGguZmxvb3IoKGMucm93Ky41KSpkLmNlbGwpLGg9bGEoYy5jb2wsYy5uZXh0X2NvbCxkKSxrPWguc2hpZnQoKSxlPXt5YzplLHgxOmssbGlzdDpofTtlLnNpZGU9ZC5zaWRlO2UuZG93bj1kLmRvd247InVwIj09Yy5rZXk/R2EoZSxnLGYpOkhhKGUsZyxmKX0pO3JldHVybiEwfWZ1bmN0aW9uIEZhKGEpe2E9e2NlbGw6YSxsZW46MiphLHNpZGU6TWF0aC5mbG9vcihhLzIpLHRyZWFkOk1hdGguZmxvb3IoYS8yMCkrMixkb3duOnt9fTtsZXQgYjtmb3IoYj0wO2I8YS5sZW47Yis9YS50cmVhZClhLmRvd25bYl09TWF0aC5mbG9vcihiL2EubGVuKmEuc2lkZSk7cmV0dXJuIGF9ZnVuY3Rpb24gbGEoYSxiLGYpe2xldCBkPVtdO2lmKGI+YSlmb3IoYSo9Zi5jZWxsLGQucHVzaChhKSxiPShiKzEpKmYuY2VsbDthPApiO2ErPWYudHJlYWQpZC5wdXNoKGEpO2Vsc2UgaWYoYjxhKWZvcihhPShhKzEpKmYuY2VsbCxkLnB1c2goYSksYio9Zi5jZWxsO2E+YjthLT1mLnRyZWFkKWQucHVzaChhKTtyZXR1cm4gZH1mdW5jdGlvbiBHYShhLGIsZil7aWYoYS54Yyl7bGV0IGQ9YS54Yy1hLnNpZGUsZz1hLnhjK2Euc2lkZTthLmxpc3QuZm9yRWFjaChjPT57ZHJhd19saW5lKGYsZCxjLGcsYyxiKX0pfWVsc2V7bGV0IGQ9YS55Yy1hLnNpZGUsZz1hLnljK2Euc2lkZTthLmxpc3QuZm9yRWFjaChjPT57ZHJhd19saW5lKGYsYyxkLGMsZyxiKX0pfXJldHVybiEwfWZ1bmN0aW9uIEhhKGEsYixmKXtpZihhLnhjKXtsZXQgZD1hLnhjO2EubGlzdC5mb3JFYWNoKGc9PntsZXQgYz1hLmRvd25bTWF0aC5hYnMoZy1hLnkxKV07ZHJhd19saW5lKGYsZC1jLGcsZCtjLGcsYil9KX1lbHNle2xldCBkPWEueWM7YS5saXN0LmZvckVhY2goZz0+e2xldCBjPWEuZG93bltNYXRoLmFicyhnLWEueDEpXTtkcmF3X2xpbmUoZixnLGQtCmMsZyxkK2MsYil9KX1yZXR1cm4hMH1mdW5jdGlvbiBJYSgpe2xldCBhPSQoImR1bmdlb25fbmFtZSIpLmdldFZhbHVlKCk7c2F2ZV9jYW52YXMoJCgibWFwIiksYCR7YX0ucG5nYCl9bGV0IEo9e21hcF9zdHlsZTp7c3RhbmRhcmQ6e3RpdGxlOiJTdGFuZGFyZCJ9LGNsYXNzaWM6e3RpdGxlOiJDbGFzc2ljIn0sZ3JhcGg6e3RpdGxlOiJHcmFwaFBhcGVyIn19LGdyaWQ6e25vbmU6e3RpdGxlOiJOb25lIn0sc3F1YXJlOnt0aXRsZToiU3F1YXJlIn0saGV4Ont0aXRsZToiSGV4In0sdmV4Ont0aXRsZToiVmVydEhleCJ9fSxkdW5nZW9uX2xheW91dDp7c3F1YXJlOnt0aXRsZToiU3F1YXJlIixhc3BlY3Q6MX0scmVjdGFuZ2xlOnt0aXRsZToiUmVjdGFuZ2xlIixhc3BlY3Q6MS4zfSxib3g6e3RpdGxlOiJCb3giLGFzcGVjdDoxLG1hc2s6W1sxLDEsMV0sWzEsMCwxXSxbMSwxLDFdXX0sY3Jvc3M6e3RpdGxlOiJDcm9zcyIsYXNwZWN0OjEsbWFzazpbWzAsMSwwXSxbMSwxLDFdLFswLDEsMF1dfSwKZGFnZ2VyOnt0aXRsZToiRGFnZ2VyIixhc3BlY3Q6MS4zLG1hc2s6W1swLDEsMF0sWzEsMSwxXSxbMCwxLDBdLFswLDEsMF1dfSxzYWx0aXJlOnt0aXRsZToiU2FsdGlyZSIsYXNwZWN0OjF9LGtlZXA6e3RpdGxlOiJLZWVwIixhc3BlY3Q6MSxtYXNrOltbMSwxLDAsMCwxLDFdLFsxLDEsMSwxLDEsMV0sWzAsMSwxLDEsMSwwXSxbMCwxLDEsMSwxLDBdLFsxLDEsMSwxLDEsMV0sWzEsMSwwLDAsMSwxXV19LGhleGFnb246e3RpdGxlOiJIZXhhZ29uIixhc3BlY3Q6Ljl9LHJvdW5kOnt0aXRsZToiUm91bmQiLGFzcGVjdDoxfX0sZHVuZ2Vvbl9zaXplOntmaW5lOnt0aXRsZToiRmluZSIsc2l6ZToyMDAsY2VsbDoxOH0sZGltaW46e3RpdGxlOiJEaW1pbml1dGl2ZSIsc2l6ZToyNTIsY2VsbDoxOH0sdGlueTp7dGl0bGU6IlRpbnkiLHNpemU6MzE4LGNlbGw6MTh9LHNtYWxsOnt0aXRsZToiU21hbGwiLHNpemU6NDAwLGNlbGw6MTh9LG1lZGl1bTp7dGl0bGU6Ik1lZGl1bSIsc2l6ZTo1MDQsCmNlbGw6MTh9LGxhcmdlOnt0aXRsZToiTGFyZ2UiLHNpemU6NjM1LGNlbGw6MTh9LGh1Z2U6e3RpdGxlOiJIdWdlIixzaXplOjgwMCxjZWxsOjE4fSxnYXJnYW50Ont0aXRsZToiR2FyZ2FudHVhbiIsc2l6ZToxMDA4LGNlbGw6MTh9LGNvbG9zc2FsOnt0aXRsZToiQ29sb3NzYWwiLHNpemU6MTI3MCxjZWxsOjE4fX0sYWRkX3N0YWlyczp7bm86e3RpdGxlOiJObyJ9LHllczp7dGl0bGU6IlllcyJ9LG1hbnk6e3RpdGxlOiJNYW55In19LHJvb21fbGF5b3V0OntzcGFyc2U6e3RpdGxlOiJTcGFyc2UifSxzY2F0dGVyZWQ6e3RpdGxlOiJTY2F0dGVyZWQifSxkZW5zZTp7dGl0bGU6IkRlbnNlIn19LHJvb21fc2l6ZTp7c21hbGw6e3RpdGxlOiJTbWFsbCIsc2l6ZToyLHJhZGl4OjJ9LG1lZGl1bTp7dGl0bGU6Ik1lZGl1bSIsc2l6ZToyLHJhZGl4OjV9LGxhcmdlOnt0aXRsZToiTGFyZ2UiLHNpemU6NSxyYWRpeDoyfSxodWdlOnt0aXRsZToiSHVnZSIsc2l6ZTo1LHJhZGl4OjUsaHVnZToxfSwKZ2FyZ2FudDp7dGl0bGU6IkdhcmdhbnR1YW4iLHNpemU6OCxyYWRpeDo1LGh1Z2U6MX0sY29sb3NzYWw6e3RpdGxlOiJDb2xvc3NhbCIsc2l6ZTo4LHJhZGl4OjgsaHVnZToxfX0sZG9vcnM6e25vbmU6e3RpdGxlOiJOb25lIn0sYmFzaWM6e3RpdGxlOiJCYXNpYyJ9LHNlY3VyZTp7dGl0bGU6IlNlY3VyZSJ9LHN0YW5kYXJkOnt0aXRsZToiU3RhbmRhcmQifSxkZWF0aHRyYXA6e3RpdGxlOiJEZWF0aHRyYXAifX0sY29ycmlkb3JfbGF5b3V0OntsYWJ5cmludGg6e3RpdGxlOiJMYWJ5cmludGgiLHBjdDowfSxlcnJhbnQ6e3RpdGxlOiJFcnJhbnQiLHBjdDo1MH0sc3RyYWlnaHQ6e3RpdGxlOiJTdHJhaWdodCIscGN0OjkwfX0scmVtb3ZlX2RlYWRlbmRzOntub25lOnt0aXRsZToiTm9uZSIscGN0OjB9LHNvbWU6e3RpdGxlOiJTb21lIixwY3Q6NTB9LGFsbDp7dGl0bGU6IkFsbCIscGN0OjEwMH19fSxtYT17bWFwX3N0eWxlOiJzdGFuZGFyZCIsZ3JpZDoic3F1YXJlIixkdW5nZW9uX2xheW91dDoicmVjdGFuZ2xlIiwKZHVuZ2Vvbl9zaXplOiJtZWRpdW0iLGFkZF9zdGFpcnM6InllcyIscm9vbV9sYXlvdXQ6InNjYXR0ZXJlZCIscm9vbV9zaXplOiJtZWRpdW0iLGRvb3JzOiJzdGFuZGFyZCIsY29ycmlkb3JfbGF5b3V0OiJlcnJhbnQiLHJlbW92ZV9kZWFkZW5kczoic29tZSJ9LFA9e25vcnRoOi0xLHNvdXRoOjEsd2VzdDowLGVhc3Q6MH0sTT17bm9ydGg6MCxzb3V0aDowLHdlc3Q6LTEsZWFzdDoxfSxDYT0kSChNKS5rZXlzKCkuc29ydCgpLERhPXtub3J0aDoic291dGgiLHNvdXRoOiJub3J0aCIsd2VzdDoiZWFzdCIsZWFzdDoid2VzdCJ9O2RvY3VtZW50Lm9ic2VydmUoImRvbTpsb2FkZWQiLCgpPT57T2JqZWN0LmtleXMoSikuZm9yRWFjaChhPT57T2JqZWN0LmtleXMoSlthXSkuZm9yRWFjaChiPT57bGV0IGY9SlthXVtiXS50aXRsZTt2YXIgZD0kKGEpLGc9ZC5pbnNlcnQ7Yj0obmV3IEVsZW1lbnQoIm9wdGlvbiIse3ZhbHVlOmJ9KSkudXBkYXRlKGYpO2cuY2FsbChkLGIpfSl9KTtPYmplY3Qua2V5cyhtYSkuZm9yRWFjaChhPT4KeyQoYSkuc2V0VmFsdWUobWFbYV0pfSk7USgpOyQoImR1bmdlb25fbmFtZSIpLm9ic2VydmUoImNoYW5nZSIsWik7JCgibmV3X25hbWUiKS5vYnNlcnZlKCJjbGljayIsUSk7T2JqZWN0LmtleXMoSikuZm9yRWFjaChhPT57JChhKS5vYnNlcnZlKCJjaGFuZ2UiLGFhKX0pOyQoInNhdmVfbWFwIikub2JzZXJ2ZSgiY2xpY2siLElhKTskKCJwcmludF9tYXAiKS5vYnNlcnZlKCJjbGljayIsKCk9Pnt3aW5kb3cucHJpbnQoKX0pfSk7bGV0IFc9e307Si5kb29ycy5ub25lLnRhYmxlPXsiMDEtMTUiOjY1NTM2fTtKLmRvb3JzLmJhc2ljLnRhYmxlPXsiMDEtMTUiOjY1NTM2LCIxNi02MCI6MTMxMDcyfTtKLmRvb3JzLnNlY3VyZS50YWJsZT17IjAxLTE1Ijo2NTUzNiwiMTYtNjAiOjEzMTA3MiwiNjEtNzUiOjI2MjE0NH07Si5kb29ycy5zdGFuZGFyZC50YWJsZT17IjAxLTE1Ijo2NTUzNiwiMTYtNjAiOjEzMTA3MiwiNjEtNzUiOjI2MjE0NCwiNzYtOTAiOjUyNDI4OCwiOTEtMTAwIjoxMDQ4NTc2LAoiMTAxLTExMCI6MjA5NzE1Mn07Si5kb29ycy5kZWF0aHRyYXAudGFibGU9eyIwMS0xNSI6NjU1MzYsIjE2LTMwIjo1MjQyODgsIjMxLTQwIjoxMDQ4NTc2fTtsZXQgWD17bm9ydGg6e3dhbGxlZDpbWzEsLTFdLFswLC0xXSxbLTEsLTFdLFstMSwwXSxbLTEsMV0sWzAsMV0sWzEsMV1dLGNvcnJpZG9yOltbMCwwXSxbMSwwXSxbMiwwXV0sc3RhaXI6WzAsMF0sbmV4dDpbMSwwXX0sc291dGg6e3dhbGxlZDpbWy0xLC0xXSxbMCwtMV0sWzEsLTFdLFsxLDBdLFsxLDFdLFswLDFdLFstMSwxXV0sY29ycmlkb3I6W1swLDBdLFstMSwwXSxbLTIsMF1dLHN0YWlyOlswLDBdLG5leHQ6Wy0xLDBdfSx3ZXN0Ont3YWxsZWQ6W1stMSwxXSxbLTEsMF0sWy0xLC0xXSxbMCwtMV0sWzEsLTFdLFsxLDBdLFsxLDFdXSxjb3JyaWRvcjpbWzAsMF0sWzAsMV0sWzAsMl1dLHN0YWlyOlswLDBdLG5leHQ6WzAsMV19LGVhc3Q6e3dhbGxlZDpbWy0xLC0xXSxbLTEsMF0sWy0xLDFdLFswLDFdLFsxLDFdLFsxLDBdLApbMSwtMV1dLGNvcnJpZG9yOltbMCwwXSxbMCwtMV0sWzAsLTJdXSxzdGFpcjpbMCwwXSxuZXh0OlswLC0xXX19LHBhPXtub3J0aDp7d2FsbGVkOltbMCwtMV0sWzEsLTFdLFsxLDBdLFsxLDFdLFswLDFdXSxjbG9zZTpbWzAsMF1dLHJlY3Vyc2U6Wy0xLDBdfSxzb3V0aDp7d2FsbGVkOltbMCwtMV0sWy0xLC0xXSxbLTEsMF0sWy0xLDFdLFswLDFdXSxjbG9zZTpbWzAsMF1dLHJlY3Vyc2U6WzEsMF19LHdlc3Q6e3dhbGxlZDpbWy0xLDBdLFstMSwxXSxbMCwxXSxbMSwxXSxbMSwwXV0sY2xvc2U6W1swLDBdXSxyZWN1cnNlOlswLC0xXX0sZWFzdDp7d2FsbGVkOltbLTEsMF0sWy0xLC0xXSxbMCwtMV0sWzEsLTFdLFsxLDBdXSxjbG9zZTpbWzAsMF1dLHJlY3Vyc2U6WzAsMV19fSxWPXtzdGFuZGFyZDp7Y29sb3JzOntmaWxsOiIjMDAwMDAwIixvcGVuOiIjZmZmZmZmIixvcGVuX2dyaWQ6IiNjY2NjY2MifX0sY2xhc3NpYzp7Y29sb3JzOntmaWxsOiIjMzM5OWNjIixvcGVuOiIjZmZmZmZmIiwKb3Blbl9ncmlkOiIjMzM5OWNjIixob3ZlcjoiI2I2ZGVmMiJ9fSxncmFwaDp7Y29sb3JzOntmaWxsOiIjZmZmZmZmIixvcGVuOiIjZmZmZmZmIixncmlkOiIjYzllYmY1Iix3YWxsOiIjNjY2NjY2Iix3YWxsX3NoYWRpbmc6IiM2NjY2NjYiLGRvb3I6IiMzMzMzMzMiLGxhYmVsOiIjMzMzMzMzIix0YWc6IiM2NjY2NjYifX19LEVhPXtkb29yOiJmaWxsIixsYWJlbDoiZmlsbCIsc3RhaXI6IndhbGwiLHdhbGw6ImZpbGwiLGZpbGw6ImJsYWNrIix0YWc6IndoaXRlIn19KTsK"></script>
    <div id="debug"></div>
  </body>
</html>
